summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2015-01-14 16:59:36 +0100
committerCarlos Garnacho <carlosg@gnome.org>2015-01-14 17:11:25 +0100
commitb8e87d47626afd7d6271425a5772f2ee774d1b78 (patch)
treeb36a66379e2af88266a09b5aa826a36544906cb3
parent594de00cad7c5e588bc3f44d1cbfce583408b0b1 (diff)
downloadgtk+-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.c20
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"