widget: Properly remove event controllers in finalize
authorTimm Bäder <mail@baedert.org>
Sat, 19 May 2018 21:03:32 +0000 (23:03 +0200)
committerTimm Bäder <mail@baedert.org>
Sat, 19 May 2018 21:03:32 +0000 (23:03 +0200)
We were mutating the list while iterating over it. This was not a
problem before since remove_controller just set the controller pointer
to NULL instead of actually removing it from the list of controllers.

gtk/gtkwidget.c

index 4727e37b4d9412c6bacb7435657ef632906da575..96c7145aa66c58da3e8f8cd2367ac7ea9cbda71a 100644 (file)
@@ -8572,15 +8572,18 @@ gtk_widget_finalize (GObject *object)
 
   _gtk_size_request_cache_free (&priv->requests);
 
-  for (l = priv->event_controllers; l; l = l->next)
+  l = priv->event_controllers;
+  while (l)
     {
+      GList *next = l->next;
       GtkEventController *controller = l->data;
 
       if (controller)
         gtk_widget_remove_controller (widget, controller);
+
+      l = next;
     }
-  g_list_free (priv->event_controllers);
-  priv->event_controllers = NULL;
+  g_assert (priv->event_controllers == NULL);
 
   if (_gtk_widget_get_first_child (widget) != NULL)
     {