[glib/new-gsettings] GSettings: new signal setup
- From: Ryan Lortie <ryanl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/new-gsettings] GSettings: new signal setup
- Date: Fri, 16 Apr 2010 19:32:05 +0000 (UTC)
commit 31b389788f1247776d1fd5466aa8d941697f4833
Author: Ryan Lortie <desrt desrt ca>
Date: Fri Apr 16 15:30:07 2010 -0400
GSettings: new signal setup
gio/gio-marshal.list | 2 +
gio/gsettings.c | 55 +++++++++++++++++++++++++++++++----------------
gio/gsettings.h | 6 +++-
gio/gsettingsbackend.c | 2 +-
gio/tests/gsettings.c | 2 +-
5 files changed, 44 insertions(+), 23 deletions(-)
---
diff --git a/gio/gio-marshal.list b/gio/gio-marshal.list
index 2d3dec5..69d946b 100644
--- a/gio/gio-marshal.list
+++ b/gio/gio-marshal.list
@@ -7,3 +7,5 @@ VOID:STRING,BOXED,BOXED
VOID:STRING,BOXED,POINTER
VOID:STRING,POINTER
VOID:POINTER,INT
+BOOL:POINTER,INT
+BOOL:UINT
diff --git a/gio/gsettings.c b/gio/gsettings.c
index 10c2cd3..32a22e4 100644
--- a/gio/gsettings.c
+++ b/gio/gsettings.c
@@ -188,6 +188,7 @@ settings_backend_changed (GSettingsBackend *backend,
gpointer user_data)
{
GSettings *settings = G_SETTINGS (user_data);
+ gboolean ignore_this;
gint i;
g_assert (settings->priv->backend == backend);
@@ -201,7 +202,7 @@ settings_backend_changed (GSettingsBackend *backend,
quark = g_quark_from_string (key + i);
g_signal_emit (settings, g_settings_signals[SIGNAL_CHANGE_EVENT],
- 0, &quark, 1);
+ 0, &quark, 1, &ignore_this);
}
}
@@ -212,12 +213,13 @@ settings_backend_path_changed (GSettingsBackend *backend,
gpointer user_data)
{
GSettings *settings = G_SETTINGS (user_data);
+ gboolean ignore_this;
g_assert (settings->priv->backend == backend);
if (g_str_has_prefix (settings->priv->path, path))
g_signal_emit (settings, g_settings_signals[SIGNAL_CHANGE_EVENT],
- 0, NULL, 0);
+ 0, NULL, 0, &ignore_this);
}
static void
@@ -228,6 +230,7 @@ settings_backend_keys_changed (GSettingsBackend *backend,
gpointer user_data)
{
GSettings *settings = G_SETTINGS (user_data);
+ gboolean ignore_this;
gint i;
g_assert (settings->priv->backend == backend);
@@ -259,7 +262,7 @@ settings_backend_keys_changed (GSettingsBackend *backend,
if (l > 0)
g_signal_emit (settings, g_settings_signals[SIGNAL_CHANGE_EVENT],
- 0, quarks, l);
+ 0, quarks, l, &ignore_this);
}
}
@@ -269,6 +272,7 @@ settings_backend_writable_changed (GSettingsBackend *backend,
gpointer user_data)
{
GSettings *settings = G_SETTINGS (user_data);
+ gboolean ignore_this;
gint i;
g_assert (settings->priv->backend == backend);
@@ -278,7 +282,7 @@ settings_backend_writable_changed (GSettingsBackend *backend,
if (settings->priv->path[i] == '\0' &&
g_settings_schema_has_key (settings->priv->schema, key + i))
g_signal_emit (settings, g_settings_signals[SIGNAL_WRITABLE_CHANGE_EVENT],
- 0, g_quark_from_string (key + i));
+ 0, g_quark_from_string (key + i), &ignore_this);
}
static void
@@ -287,12 +291,13 @@ settings_backend_path_writable_changed (GSettingsBackend *backend,
gpointer user_data)
{
GSettings *settings = G_SETTINGS (user_data);
+ gboolean ignore_this;
g_assert (settings->priv->backend == backend);
if (g_str_has_prefix (settings->priv->path, path))
g_signal_emit (settings, g_settings_signals[SIGNAL_WRITABLE_CHANGE_EVENT],
- 0, (GQuark) 0);
+ 0, (GQuark) 0, &ignore_this);
}
static void
@@ -518,14 +523,17 @@ g_settings_class_init (GSettingsClass *class)
* The "changed" signal is emitted when a key has potentially changed.
* You should call one of the g_settings_get() calls to check the new
* value.
+ *
+ * This signal supports detailed connections. You can connect to the
+ * detailed signal "changed::x" in order to only receive callbacks
+ * when key "x" changes.
*/
g_settings_signals[SIGNAL_CHANGED] =
g_signal_new ("changed", G_TYPE_SETTINGS,
- G_SIGNAL_RUN_LAST,
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
G_STRUCT_OFFSET (GSettingsClass, changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 1,
- G_TYPE_STRING | G_SIGNAL_STATIC_SCOPE);
+ NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE,
+ 1, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
/**
* GSettings::change-event:
@@ -536,9 +544,10 @@ g_settings_class_init (GSettingsClass *class)
* event. FALSE to propagate the event further.
*
* The "change-event" signal is emitted once per change event that
- * affects this settings object. You should connect to this signal if
- * you are interested in viewing groups of changes before they are
- * split out into multiple calls to the "changed" signal.
+ * affects this settings object. You should connect to this signal
+ * only if you are interested in viewing groups of changes before they
+ * are split out into multiple calls to the "changed" signal. For
+ * most use cases it is more appropriate to use the "changed" signal.
*
* In the event that the change event applies to one or more specified
* keys, @keys will be an array of #GQuark of length @n_keys. In the
@@ -555,7 +564,7 @@ g_settings_class_init (GSettingsClass *class)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GSettingsClass, change_event),
g_signal_accumulator_true_handled, NULL,
- _gio_marshal_VOID__POINTER_INT,
+ _gio_marshal_BOOL__POINTER_INT,
G_TYPE_BOOLEAN, 2, G_TYPE_POINTER, G_TYPE_INT);
/**
@@ -566,6 +575,10 @@ g_settings_class_init (GSettingsClass *class)
* The "writable-changed" signal is emitted when the writability of a
* key has potentially changed. You should call
* g_settings_is_writable() in order to determine the new status.
+ *
+ * This signal supports detailed connections. You can connect to the
+ * detailed signal "writable-changed::x" in order to only receive
+ * callbacks when the writability of "x" changes.
*/
g_settings_signals[SIGNAL_WRITABLE_CHANGED] =
g_signal_new ("writable-changed", G_TYPE_SETTINGS,
@@ -585,7 +598,8 @@ g_settings_class_init (GSettingsClass *class)
* change event that affects this settings object. You should connect
* to this signal if you are interested in viewing groups of changes
* before they are split out into multiple calls to the
- * "writable-changed" signal.
+ * "writable-changed" signal. For most use cases it is more
+ * appropriate to use the "writable-changed" signal.
*
* In the event that the writability change applies only to a single
* key, @key will be set to the #GQuark for that key. In the event
@@ -593,15 +607,18 @@ g_settings_class_init (GSettingsClass *class)
* @key will be 0.
*
* The default handler for this signal invokes the "writabile-changed"
- * signal for each affected key. If any other connected handler
- * returns %TRUE then this default functionality will be supressed.
+ * and "changed" signals for each affected key. This is done because
+ * changes in writability might also imply changes in value (if for
+ * example, a new mandatory setting is introduced). If any other
+ * connected handler returns %TRUE then this default functionality
+ * will be supressed.
*/
g_settings_signals[SIGNAL_WRITABLE_CHANGE_EVENT] =
- g_signal_new ("all-writable-changed", G_TYPE_SETTINGS,
+ g_signal_new ("writable-change-event", G_TYPE_SETTINGS,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GSettingsClass, all_changed),
+ G_STRUCT_OFFSET (GSettingsClass, writable_change_event),
g_signal_accumulator_true_handled, NULL,
- g_cclosure_marshal_BOOL__INT, G_TYPE_BOOLEAN, 0);
+ _gio_marshal_BOOLEAN__UINT, G_TYPE_BOOLEAN, 1, G_TYPE_UINT);
/**
* GSettings:context:
diff --git a/gio/gsettings.h b/gio/gsettings.h
index 142c0d2..3fbe763 100644
--- a/gio/gsettings.h
+++ b/gio/gsettings.h
@@ -49,11 +49,13 @@ struct _GSettingsClass
const gchar *key);
void (*changed) (GSettings *settings,
const gchar *key);
- void (*writable_change_event) (GSettings *settings,
+ gboolean (*writable_change_event) (GSettings *settings,
GQuark key);
- void (*change_event) (GSettings *settings,
+ gboolean (*change_event) (GSettings *settings,
const GQuark *keys,
gint n_keys);
+
+ gpointer padding[20];
};
struct _GSettings
diff --git a/gio/gsettingsbackend.c b/gio/gsettingsbackend.c
index 3b3de90..aecc4a7 100644
--- a/gio/gsettingsbackend.c
+++ b/gio/gsettingsbackend.c
@@ -876,7 +876,7 @@ g_settings_backend_supports_context (const gchar *context)
{
GSettingsBackend *backend;
- g_return_val_if_fail (context != NULL, NULL);
+ g_return_val_if_fail (context != NULL, FALSE);
backend = get_default_backend (context);
diff --git a/gio/tests/gsettings.c b/gio/tests/gsettings.c
index 0c573d3..bce7c8e 100644
--- a/gio/tests/gsettings.c
+++ b/gio/tests/gsettings.c
@@ -455,7 +455,7 @@ test_atomic (void)
changed_cb_called = FALSE;
changed_cb_called2 = FALSE;
- g_signal_connect (settings2, "keys-changed",
+ g_signal_connect (settings2, "change-event",
G_CALLBACK (keys_changed_cb), NULL);
g_settings_delay (settings);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]