diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2015-01-14 16:59:36 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2015-01-14 17:11:25 +0100 |
commit | b8e87d47626afd7d6271425a5772f2ee774d1b78 (patch) | |
tree | b36a66379e2af88266a09b5aa826a36544906cb3 | |
parent | 594de00cad7c5e588bc3f44d1cbfce583408b0b1 (diff) | |
download | gtk+-b8e87d47626afd7d6271425a5772f2ee774d1b78.tar.gz |
widget: Free the controller list on finalize()
If this is done on dispose(), the widget may be destroyed (and its
controllers list NULLified) within _gtk_widget_run_controllers(),
causing warnings/crashes when it just tried to hop on the next
controllers.
Freeing the controllers here should be a safety net for implementations,
so it also makes sense to do this late. The widgets that choose to
free their controllers on dispose can still do so, and get
_gtk_widget_remove_controller() called for these as an indirect result.
-rw-r--r-- | gtk/gtkwidget.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 27c1ec5948..65fd0959ff 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -11924,7 +11924,6 @@ gtk_widget_dispose (GObject *object) { GtkWidget *widget = GTK_WIDGET (object); GtkWidgetPrivate *priv = widget->priv; - GList *l; if (priv->parent) gtk_container_remove (GTK_CONTAINER (priv->parent), widget); @@ -11947,15 +11946,6 @@ gtk_widget_dispose (GObject *object) while (priv->attached_windows) gtk_window_set_attached_to (priv->attached_windows->data, NULL); - for (l = priv->event_controllers; l; l = l->next) - { - EventControllerData *data = l->data; - if (data->controller) - _gtk_widget_remove_controller (widget, data->controller); - } - g_list_free_full (priv->event_controllers, g_free); - priv->event_controllers = NULL; - G_OBJECT_CLASS (gtk_widget_parent_class)->dispose (object); } @@ -12150,6 +12140,7 @@ gtk_widget_finalize (GObject *object) GtkWidgetPrivate *priv = widget->priv; GtkWidgetAuxInfo *aux_info; GtkAccessible *accessible; + GList *l; gtk_grab_remove (widget); @@ -12176,6 +12167,15 @@ gtk_widget_finalize (GObject *object) _gtk_size_request_cache_free (&priv->requests); + for (l = priv->event_controllers; l; l = l->next) + { + EventControllerData *data = l->data; + if (data->controller) + _gtk_widget_remove_controller (widget, data->controller); + } + g_list_free_full (priv->event_controllers, g_free); + priv->event_controllers = NULL; + if (g_object_is_floating (object)) g_warning ("A floating object was finalized. This means that someone\n" "called g_object_unref() on an object that had only a floating\n" |