[libdazzle] preferences: be more defensive with tracked widgets



commit 75af333221760fb22c0822ff4e77f28131205014
Author: Christian Hergert <chergert redhat com>
Date:   Sun Jan 14 17:48:48 2018 -0800

    preferences: be more defensive with tracked widgets

 src/prefs/dzl-preferences-view.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)
---
diff --git a/src/prefs/dzl-preferences-view.c b/src/prefs/dzl-preferences-view.c
index 726af8d..9d3a7f1 100644
--- a/src/prefs/dzl-preferences-view.c
+++ b/src/prefs/dzl-preferences-view.c
@@ -63,10 +63,19 @@ tracked_widget_free (gpointer data)
   TrackedWidget *tracked = data;
 
   if (tracked->widget != NULL)
-    g_signal_handler_disconnect (tracked->widget, tracked->handler);
+    {
+      dzl_clear_signal_handler (tracked->widget, &tracked->handler);
+      tracked->widget = NULL;
+    }
+
+  tracked->handler = 0;
+  tracked->id = 0;
+
   g_slice_free (TrackedWidget, tracked);
 }
 
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (TrackedWidget, tracked_widget_free)
+
 static void
 dzl_preferences_view_track (DzlPreferencesView *self,
                             guint               id,
@@ -849,10 +858,10 @@ dzl_preferences_view_remove_id (DzlPreferences *preferences,
 {
   DzlPreferencesView *self = (DzlPreferencesView *)preferences;
   DzlPreferencesViewPrivate *priv = dzl_preferences_view_get_instance_private (self);
-  TrackedWidget *tracked;
+  g_autoptr(TrackedWidget) tracked = NULL;
 
   g_assert (DZL_IS_PREFERENCES_VIEW (self));
-  g_assert (widget_id);
+  g_assert (widget_id != 0);
 
   tracked = g_hash_table_lookup (priv->widgets, GUINT_TO_POINTER (widget_id));
 
@@ -860,7 +869,10 @@ dzl_preferences_view_remove_id (DzlPreferences *preferences,
     {
       GtkWidget *widget = tracked->widget;
 
-      g_hash_table_remove (priv->widgets, GUINT_TO_POINTER (widget_id));
+      /* We have to steal the structure so that we retain access to
+       * the structure after removing it from the hashtable.
+       */
+      g_hash_table_steal (priv->widgets, GUINT_TO_POINTER (widget_id));
 
       if (widget != NULL && !gtk_widget_in_destruction (widget))
         {
@@ -871,9 +883,9 @@ dzl_preferences_view_remove_id (DzlPreferences *preferences,
             gtk_widget_destroy (parent);
           else
             gtk_widget_destroy (widget);
-
-          return TRUE;
         }
+
+      return TRUE;
     }
 
   return FALSE;


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