[glib/new-gsettings] GSettings: new signal setup



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]