diff options
author | Ryan Lortie <desrt@desrt.ca> | 2013-10-27 11:09:39 -0700 |
---|---|---|
committer | Ryan Lortie <desrt@desrt.ca> | 2013-10-28 10:24:20 -0700 |
commit | 863fa5c1ee630a2ba3988896a957b922faceee87 (patch) | |
tree | f4d61a9bfb88ccc909029f881917604400fa02e7 /engine | |
parent | af4cab4ae533d21e8a02b6041c43e928bc74f96e (diff) | |
download | dconf-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.c | 45 | ||||
-rw-r--r-- | engine/dconf-engine.h | 5 |
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); |