[libhandy/wip/exalm/alpha-fixes: 4/8] swipe-tracker: Make swipeable a weak ref




commit d2db1dfa457deaa92f721d78856a9e32eab573e7
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Fri Nov 12 00:35:55 2021 +0500

    swipe-tracker: Make swipeable a weak ref
    
    Fix a refcycle between the widget and the swipe tracker.
    
    Backported from 
https://gitlab.gnome.org/GNOME/libadwaita/-/commit/2821a1063e332d00b9b2fc00ba28e5d1c754645f

 src/hdy-swipe-tracker.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)
---
diff --git a/src/hdy-swipe-tracker.c b/src/hdy-swipe-tracker.c
index e98d63b2..03b41781 100644
--- a/src/hdy-swipe-tracker.c
+++ b/src/hdy-swipe-tracker.c
@@ -117,6 +117,24 @@ enum {
 
 static guint signals[SIGNAL_LAST_SIGNAL];
 
+static void
+set_swipeable (HdySwipeTracker *self,
+               HdySwipeable    *swipeable)
+{
+  if (self->swipeable == swipeable)
+    return;
+
+  if (self->swipeable)
+    g_object_remove_weak_pointer (G_OBJECT (self->swipeable),
+                                  (gpointer *) &self->swipeable);
+
+  self->swipeable = swipeable;
+
+  if (self->swipeable)
+    g_object_add_weak_pointer (G_OBJECT (self->swipeable),
+                               (gpointer *) &self->swipeable);
+}
+
 static gboolean
 get_widget_coordinates (HdySwipeTracker *self,
                         GdkEvent        *event,
@@ -936,7 +954,7 @@ hdy_swipe_tracker_dispose (GObject *object)
 
   g_clear_pointer (&self->event_history, g_array_unref);
   g_clear_object (&self->touch_gesture);
-  g_clear_object (&self->swipeable);
+  set_swipeable (self, NULL);
 
   G_OBJECT_CLASS (hdy_swipe_tracker_parent_class)->dispose (object);
 }
@@ -989,7 +1007,7 @@ hdy_swipe_tracker_set_property (GObject      *object,
 
   switch (prop_id) {
   case PROP_SWIPEABLE:
-    self->swipeable = HDY_SWIPEABLE (g_object_ref (g_value_get_object (value)));
+    set_swipeable (self, g_value_get_object (value));
     break;
 
   case PROP_ENABLED:


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