diff --git a/gio/gsettings.c b/gio/gsettings.c index fb2ce2576..23a14bcc9 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;