[glib] GSettings: fix check for delaying backend subscription
- From: Lars Uebernickel <larsu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] GSettings: fix check for delaying backend subscription
- Date: Fri, 28 Nov 2014 14:19:40 +0000 (UTC)
commit d511d6b37f051d2cd8698055cbd85ee7f987325d
Author: Lars Uebernickel <lars uebernickel canonical com>
Date: Fri Nov 28 13:06:04 2014 +0100
GSettings: fix check for delaying backend subscription
g_settings_has_signal_handlers() checks whether any of the signals has
pending handlers. However, g_signal_has_handler_pending() matches on
exact detail, even when passing 0. Subscribing to one of GSettings'
signals with a detail will fail this check and never connect to the
backend.
Fix this by calling has_handler_pending() with the key as detail as
well.
https://bugzilla.gnome.org/show_bug.cgi?id=740848
gio/gsettings.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
---
diff --git a/gio/gsettings.c b/gio/gsettings.c
index fb2ce25..23a14bc 100644
--- a/gio/gsettings.c
+++ b/gio/gsettings.c
@@ -317,18 +317,24 @@ g_settings_real_writable_change_event (GSettings *settings,
}
static gboolean
-g_settings_has_signal_handlers (GSettings *settings)
+g_settings_has_signal_handlers (GSettings *settings,
+ const gchar *key)
{
GSettingsClass *class = G_SETTINGS_GET_CLASS (settings);
+ GQuark keyq;
if (class->change_event != g_settings_real_change_event ||
class->writable_change_event != g_settings_real_writable_change_event)
return TRUE;
+ keyq = g_quark_from_string (key);
+
if (g_signal_has_handler_pending (settings, g_settings_signals[SIGNAL_WRITABLE_CHANGE_EVENT], 0, TRUE) ||
g_signal_has_handler_pending (settings, g_settings_signals[SIGNAL_WRITABLE_CHANGED], 0, TRUE) ||
+ g_signal_has_handler_pending (settings, g_settings_signals[SIGNAL_WRITABLE_CHANGED], keyq, TRUE) ||
g_signal_has_handler_pending (settings, g_settings_signals[SIGNAL_CHANGE_EVENT], 0, TRUE) ||
- g_signal_has_handler_pending (settings, g_settings_signals[SIGNAL_CHANGED], 0, TRUE))
+ g_signal_has_handler_pending (settings, g_settings_signals[SIGNAL_CHANGED], 0, TRUE) ||
+ g_signal_has_handler_pending (settings, g_settings_signals[SIGNAL_CHANGED], keyq, TRUE))
return TRUE;
/* None of that? Then surely nobody is watching.... */
@@ -1078,7 +1084,7 @@ g_settings_read_from_backend (GSettings *settings,
gchar *path;
/* If we are not yet watching for changes, consider doing it now... */
- if (!settings->priv->is_subscribed && g_settings_has_signal_handlers (settings))
+ if (!settings->priv->is_subscribed && g_settings_has_signal_handlers (settings, key->name))
{
g_settings_backend_subscribe (settings->priv->backend, settings->priv->path);
settings->priv->is_subscribed = TRUE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]