[gnome-builder] signal-group: Fix connecting to a detailed signal



commit cfc179b06ca86661ee355329602024e48bb28a33
Author: Garrett Regier <garrett regier riftio com>
Date:   Tue Jun 2 05:40:46 2015 -0700

    signal-group: Fix connecting to a detailed signal
    
    If a GQuark had not been created for the
    detail before connecting than we would
    connect to the non-detailed signal.

 contrib/egg/egg-signal-group.c |    2 +-
 tests/test-egg-signal-group.c  |   29 +++++++++++++++++++++++++----
 2 files changed, 26 insertions(+), 5 deletions(-)
---
diff --git a/contrib/egg/egg-signal-group.c b/contrib/egg/egg-signal-group.c
index 2e76185..5367a62 100644
--- a/contrib/egg/egg-signal-group.c
+++ b/contrib/egg/egg-signal-group.c
@@ -609,7 +609,7 @@ egg_signal_group_connect_full (EggSignalGroup *self,
   g_return_if_fail (EGG_IS_SIGNAL_GROUP (self));
   g_return_if_fail (detailed_signal != NULL);
   g_return_if_fail (g_signal_parse_name (detailed_signal, self->target_type,
-                                         &signal_id, &signal_detail, FALSE) != 0);
+                                         &signal_id, &signal_detail, TRUE) != 0);
   g_return_if_fail (callback != NULL);
 
   if ((flags & G_CONNECT_SWAPPED) != 0)
diff --git a/tests/test-egg-signal-group.c b/tests/test-egg-signal-group.c
index 45dd84c..08f7c83 100644
--- a/tests/test-egg-signal-group.c
+++ b/tests/test-egg-signal-group.c
@@ -11,6 +11,9 @@ typedef struct _SignalTarget
 G_DECLARE_FINAL_TYPE (SignalTarget, signal_target, TEST, SIGNAL_TARGET, GObject)
 G_DEFINE_TYPE (SignalTarget, signal_target, G_TYPE_OBJECT)
 
+static
+G_DEFINE_QUARK (detail, signal_detail)
+
 enum {
   THE_SIGNAL,
   NEVER_EMITTED,
@@ -25,7 +28,7 @@ signal_target_class_init (SignalTargetClass *klass)
   gSignals [THE_SIGNAL] =
     g_signal_new ("the-signal",
                   G_TYPE_FROM_CLASS (klass),
-                  G_SIGNAL_RUN_LAST,
+                  G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
                   0,
                   NULL, NULL, NULL,
                   G_TYPE_NONE,
@@ -76,7 +79,7 @@ connect_after_cb (SignalTarget   *target,
   g_assert (signal_calls != NULL);
   g_assert (signal_calls == &global_signal_calls);
 
-  g_assert_cmpint (*signal_calls, ==, 3);
+  g_assert_cmpint (*signal_calls, ==, 4);
   *signal_calls += 1;
 }
 
@@ -114,6 +117,14 @@ connect_object_cb (SignalTarget   *target,
 }
 
 static void
+connect_bad_detail_cb (SignalTarget   *target,
+                       EggSignalGroup *group,
+                       GObject        *object)
+{
+  g_error ("This detailed signal is never emitted!");
+}
+
+static void
 connect_never_emitted_cb (SignalTarget *target,
                           gboolean     *weak_notify_called)
 {
@@ -176,6 +187,15 @@ connect_all_signals (EggSignalGroup *group)
                      (GWeakNotify)g_object_unref,
                      object);
 
+  /* Check that a detailed signal is handled correctly */
+  egg_signal_group_connect (group,
+                            "the-signal::detail",
+                            G_CALLBACK (connect_before_cb),
+                            &global_signal_calls);
+  egg_signal_group_connect (group,
+                            "the-signal::bad-detail",
+                            G_CALLBACK (connect_bad_detail_cb),
+                            NULL);
 
   /* Check that the notify is called correctly */
   global_weak_notify_called = FALSE;
@@ -199,8 +219,9 @@ assert_signals (SignalTarget   *target,
   g_assert (group == NULL || EGG_IS_SIGNAL_GROUP (group));
 
   global_signal_calls = 0;
-  g_signal_emit (target, gSignals [THE_SIGNAL], 0, group);
-  g_assert_cmpint (global_signal_calls, ==, success ? 4 : 0);
+  g_signal_emit (target, gSignals [THE_SIGNAL],
+                 signal_detail_quark (), group);
+  g_assert_cmpint (global_signal_calls, ==, success ? 5 : 0);
 }
 
 static void


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