From d511d6b37f051d2cd8698055cbd85ee7f987325d Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Fri, 28 Nov 2014 13:06:04 +0100 Subject: [PATCH] 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 file 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; -- 2.7.4