[glib] Revert "GSettings: delay backend subscription"



commit 1dec512a66fddfd8b4b265231b00d4f918b16cef
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Sep 1 10:21:26 2015 -0400

    Revert "GSettings: delay backend subscription"
    
    This reverts commit 8ff5668a458344da22d30491e3ce726d861b3619.
    
    This change has had considerable fallout, and there was no
    follow-up to address it.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=733791

 gio/gsettings-tool.c |   13 -------------
 gio/gsettings.c      |   47 ++++-------------------------------------------
 2 files changed, 4 insertions(+), 56 deletions(-)
---
diff --git a/gio/gsettings-tool.c b/gio/gsettings-tool.c
index 2220fef..6a302ce 100644
--- a/gio/gsettings-tool.c
+++ b/gio/gsettings-tool.c
@@ -412,8 +412,6 @@ value_changed (GSettings   *settings,
 static void
 gsettings_monitor (void)
 {
-  gchar **keys;
-
   if (global_key)
     {
       gchar *name;
@@ -424,17 +422,6 @@ gsettings_monitor (void)
   else
     g_signal_connect (global_settings, "changed", G_CALLBACK (value_changed), NULL);
 
-  /* We have to read a value from GSettings before we start receiving
-   * signals...
-   *
-   * If the schema has zero keys then we won't be displaying any
-   * notifications anyway.
-   */
-  keys = g_settings_schema_list_keys (global_schema);
-  if (keys[0])
-    g_variant_unref (g_settings_get_value (global_settings, keys[0]));
-  g_strfreev (keys);
-
   for (;;)
     g_main_context_iteration (NULL, TRUE);
 }
diff --git a/gio/gsettings.c b/gio/gsettings.c
index 35e9441..03aecde 100644
--- a/gio/gsettings.c
+++ b/gio/gsettings.c
@@ -84,16 +84,6 @@
  * the names must begin with a lowercase character, must not end
  * with a '-', and must not contain consecutive dashes.
  *
- * GSettings supports change notification.  The primary mechanism to
- * watch for changes is to connect to the "changed" signal.  You can
- * optionally watch for changes on only a single key by using a signal
- * detail.  Signals are only guaranteed to be emitted for a given key
- * after you have read the value of that key while a signal handler was
- * connected for that key.  Signals may or may not be emitted in the
- * case that the key "changed" to the value that you had previously
- * read.  Signals may be reported in additional cases as well and the
- * "changed" signal should really be treated as "may have changed".
- *
  * Similar to GConf, the default values in GSettings schemas can be
  * localized, but the localized values are stored in gettext catalogs
  * and looked up with the domain that is specified in the
@@ -348,8 +338,6 @@ struct _GSettingsPrivate
   GSettingsSchema *schema;
   gchar *path;
 
-  gboolean is_subscribed;
-
   GDelayedSettingsBackend *delayed;
 };
 
@@ -425,26 +413,6 @@ g_settings_real_writable_change_event (GSettings *settings,
   return FALSE;
 }
 
-static gboolean
-g_settings_has_signal_handlers (GSettings *settings)
-{
-  GSettingsClass *class = G_SETTINGS_GET_CLASS (settings);
-
-  if (class->change_event != g_settings_real_change_event ||
-      class->writable_change_event != g_settings_real_writable_change_event)
-    return TRUE;
-
-  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_CHANGE_EVENT], 0, TRUE) ||
-      g_signal_has_handler_pending (settings, g_settings_signals[SIGNAL_CHANGED], 0, TRUE))
-    return TRUE;
-
-  /* None of that?  Then surely nobody is watching.... */
-  return FALSE;
-}
-
-
 static void
 settings_backend_changed (GObject             *target,
                           GSettingsBackend    *backend,
@@ -711,6 +679,8 @@ g_settings_constructed (GObject *object)
   g_settings_backend_watch (settings->priv->backend,
                             &listener_vtable, G_OBJECT (settings),
                             settings->priv->main_context);
+  g_settings_backend_subscribe (settings->priv->backend,
+                                settings->priv->path);
 }
 
 static void
@@ -718,10 +688,8 @@ g_settings_finalize (GObject *object)
 {
   GSettings *settings = G_SETTINGS (object);
 
-  if (settings->priv->is_subscribed)
-    g_settings_backend_unsubscribe (settings->priv->backend,
-                                    settings->priv->path);
-
+  g_settings_backend_unsubscribe (settings->priv->backend,
+                                  settings->priv->path);
   g_main_context_unref (settings->priv->main_context);
   g_object_unref (settings->priv->backend);
   g_settings_schema_unref (settings->priv->schema);
@@ -1186,13 +1154,6 @@ g_settings_read_from_backend (GSettings          *settings,
   GVariant *fixup;
   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))
-    {
-      g_settings_backend_subscribe (settings->priv->backend, settings->priv->path);
-      settings->priv->is_subscribed = TRUE;
-    }
-
   path = g_strconcat (settings->priv->path, key->name, NULL);
   if (user_value_only)
     value = g_settings_backend_read_user_value (settings->priv->backend, path, key->type);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]