diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | engine/dconf-engine.c | 45 | ||||
-rw-r--r-- | engine/dconf-engine.h | 5 | ||||
-rw-r--r-- | gsettings/dconfsettingsbackend.c | 11 |
4 files changed, 62 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index 90ad234..e603e20 100644 --- a/configure.ac +++ b/configure.ac @@ -43,7 +43,7 @@ GLIB_GSETTINGS GTK_DOC_CHECK([1.15]) # Dependencies -PKG_CHECK_MODULES(glib, glib-2.0 >= 2.35.2) +PKG_CHECK_MODULES(glib, glib-2.0 >= 2.39.1) PKG_CHECK_MODULES(gio, gio-unix-2.0) PKG_CHECK_MODULES(dbus, dbus-1) 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); diff --git a/gsettings/dconfsettingsbackend.c b/gsettings/dconfsettingsbackend.c index 53f701e..85930d2 100644 --- a/gsettings/dconfsettingsbackend.c +++ b/gsettings/dconfsettingsbackend.c @@ -63,6 +63,16 @@ dconf_settings_backend_read (GSettingsBackend *backend, return value; } +static GVariant * +dconf_settings_backend_read_user_value (GSettingsBackend *backend, + const gchar *key, + const GVariantType *expected_type) +{ + DConfSettingsBackend *dcsb = (DConfSettingsBackend *) backend; + + return dconf_engine_read_user_value (dcsb->engine, NULL, key); +} + static gboolean dconf_settings_backend_write (GSettingsBackend *backend, const gchar *key, @@ -193,6 +203,7 @@ dconf_settings_backend_class_init (GSettingsBackendClass *class) object_class->finalize = dconf_settings_backend_finalize; class->read = dconf_settings_backend_read; + class->read_user_value = dconf_settings_backend_read_user_value; class->write = dconf_settings_backend_write; class->write_tree = dconf_settings_backend_write_tree; class->reset = dconf_settings_backend_reset; |