[glib/wip/settings-backend: 12/14] GSettings: add child add/remove APIs
- From: Ryan Lortie <ryanl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/settings-backend: 12/14] GSettings: add child add/remove APIs
- Date: Sun, 29 Jul 2012 09:35:40 +0000 (UTC)
commit b6a06b2c95dfaa07df5e70f01bfef8ffdd511768
Author: Ryan Lortie <desrt desrt ca>
Date: Sun Jan 1 19:16:01 2012 -0500
GSettings: add child add/remove APIs
gio/gio.symbols | 5 ++
gio/gsettings.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
gio/gsettings.h | 19 ++++++++-
3 files changed, 145 insertions(+), 1 deletions(-)
---
diff --git a/gio/gio.symbols b/gio/gio.symbols
index 814efa3..588f9af 100644
--- a/gio/gio.symbols
+++ b/gio/gio.symbols
@@ -1203,6 +1203,11 @@ g_settings_get_mapped
g_settings_get_range
g_settings_range_check
g_credentials_get_type
+g_settings_add_child
+g_settings_can_add_child
+g_settings_can_remove_child
+g_settings_remove_child
+g_settings_get_destroyed
g_credentials_new
g_credentials_to_string
g_credentials_get_native
diff --git a/gio/gsettings.c b/gio/gsettings.c
index 776ed77..46229a4 100644
--- a/gio/gsettings.c
+++ b/gio/gsettings.c
@@ -240,6 +240,7 @@ struct _GSettingsPrivate
gchar *path;
gboolean delayed_apply;
+ gboolean destroyed;
};
enum
@@ -651,6 +652,7 @@ g_settings_constructed (GObject *object)
g_signal_connect_object (settings->priv->backend, "event", G_CALLBACK (g_settings_got_event), settings, 0);
g_settings_backend_subscribe (settings->priv->backend, settings->priv->path);
+ settings->priv->destroyed = g_settings_backend_check_exists (settings->priv->backend, settings->priv->path);
}
static void
@@ -2219,6 +2221,7 @@ g_settings_list_children (GSettings *settings)
gint i, j;
keys = g_settings_schema_list (settings->priv->schema, &n_keys);
+
strv = g_new (gchar *, n_keys + 1);
for (i = j = 0; i < n_keys; i++)
{
@@ -3178,6 +3181,125 @@ g_settings_create_action (GSettings *settings,
return G_ACTION (gsa);
}
+/* Children (add, remove, can_{add,remove}, list, get_destroyed) {{{1 */
+
+/**
+ * g_settings_add_child:
+ * @settings: a list #GSettings
+ * @prefix: the prefix of the new child name
+ * @name: return location for the new child name
+ * @returns: %TRUE if the child was added
+ *
+ * Adds a child to a list.
+ *
+ * The child will be created with a new unique name that starts with
+ * @prefix. For example, if @prefix is "item" then the child's name may
+ * end up looking like "item0", "item1", or so on. No particular format
+ * is specified -- only that the resulting name will have the given
+ * prefix.
+ *
+ * If the creation was successful then @name (if non-%NULL) is set to
+ * the name of the new child and %TRUE is returned.
+ *
+ * If the creation fails then %FALSE is returned and @name is untouched.
+ **/
+gboolean
+g_settings_add_child (GSettings *settings,
+ gchar **name)
+{
+ g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE);
+
+ return g_settings_backend_insert (settings->priv->backend, settings->priv->path, NULL, name);
+}
+
+/**
+ * g_settings_remove_child:
+ * @settings: a list #GSettings
+ * @id: the id of the child to remove
+ * @returns: %TRUE if the child was successfully removed
+ *
+ * Removes a child from the list.
+ *
+ * In the case that the removal was successful then %TRUE is returned.
+ * In the case that it failed, %FALSE is returned.
+ *
+ * The return value of this function is not particularly useful, since
+ * it is not specified if the non-operation resulting from the request
+ * to remove a non-existent child is considered to be a success (and
+ * this situation can easily arise as a race condition). Most usually
+ * you will actually probably want to ignore the return value here and
+ * just monitor the "children-changed" signal and make changes to your
+ * user interface accordingly.
+ **/
+gboolean
+g_settings_remove_child (GSettings *settings,
+ const gchar *id)
+{
+ g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE);
+ g_return_val_if_fail (id != NULL, FALSE);
+
+ return g_settings_backend_remove (settings->priv->backend,
+ settings->priv->path,
+ id);
+}
+
+/**
+ * g_settings_can_add_child:
+ * @settings: a #GSettings object
+ * @returns: %TRUE if a call to g_settings_add_child() would succeed
+ *
+ * Checks if it is valid to add children to @settings.
+ **/
+gboolean
+g_settings_can_add_child (GSettings *settings,
+ const gchar *before)
+{
+ g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE);
+
+ return g_settings_backend_can_insert (settings->priv->backend, settings->priv->path, before);
+}
+
+/**
+ * g_settings_can_remove_child:
+ * @settings: a #GSettings object
+ * @id: the identifier of an existing child
+ * @returns: %TRUE if a call to g_settings_remove_child() would succeed
+ *
+ * Checks if it is valid to remove @id from @settings.
+ *
+ * The return value of this function is unspecified for the case that
+ * @id does not exist.
+ **/
+gboolean
+g_settings_can_remove_child (GSettings *settings,
+ const gchar *id)
+{
+ g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE);
+
+ return g_settings_backend_can_remove (settings->priv->backend, settings->priv->path, id);
+}
+
+/**
+ * g_settings_get_destroyed:
+ * @settings: a #GSettings
+ * @returns: %TRUE if @settings has been destroyed
+ *
+ * Checks if @settings has been destroyed.
+ *
+ * If @settings is a member of a list (or a child thereof) and has since
+ * been removed from the list then it will be considered as having been
+ * destroyed. The "notify" signal will be emitted on the "destroyed"
+ * property and this function will return %TRUE thereafter.
+ *
+ * A destroyed #GSettings object is never revived and nearly all
+ * operations performed on it will be meaningless.
+ **/
+gboolean
+g_settings_get_destroyed (GSettings *settings)
+{
+ return settings->priv->destroyed;
+}
+
/* Epilogue {{{1 */
/* vim:set foldmethod=marker: */
diff --git a/gio/gsettings.h b/gio/gsettings.h
index 0024a28..c363c5d 100644
--- a/gio/gsettings.h
+++ b/gio/gsettings.h
@@ -60,7 +60,10 @@ struct _GSettingsClass
const GQuark *keys,
gint n_keys);
- gpointer padding[20];
+ void (*can_remove_changed) (GSettings *settings);
+ void (*children_changed) (GSettings *settings);
+
+ gpointer padding[18];
};
struct _GSettings
@@ -278,6 +281,20 @@ gpointer g_settings_get_mapped (GSettin
GSettingsGetMapping mapping,
gpointer user_data);
+gboolean g_settings_can_add_child (GSettings *settings,
+ const gchar *before);
+
+gboolean g_settings_can_remove_child (GSettings *settings,
+ const gchar *id);
+
+gboolean g_settings_add_child (GSettings *settings,
+ gchar **name);
+
+gboolean g_settings_remove_child (GSettings *settings,
+ const gchar *id);
+
+gboolean g_settings_get_destroyed (GSettings *settings);
+
G_END_DECLS
#endif /* __G_SETTINGS_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]