summaryrefslogtreecommitdiff
path: root/gtk/inspector
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2019-05-25 22:30:29 +0200
committerBenjamin Otte <otte@redhat.com>2019-05-25 22:32:35 +0200
commit0cd8dd4294d97b9eeeed319dfdedd17328ed79de (patch)
tree2bb0340783d5d9775d5bace90a85b2acf671edb0 /gtk/inspector
parentc50052e2233ae945c241033b784e7c3bad9444b5 (diff)
downloadgtk+-0cd8dd4294d97b9eeeed319dfdedd17328ed79de.tar.gz
inspector: Make updates overlay not crash
... when a window gets hidden and later reshown. The code now properly cleans up a window when it gets unmapped instead of trying to retain previous updates information.
Diffstat (limited to 'gtk/inspector')
-rw-r--r--gtk/inspector/updatesoverlay.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/gtk/inspector/updatesoverlay.c b/gtk/inspector/updatesoverlay.c
index 9a5d3069b7..913476dcbf 100644
--- a/gtk/inspector/updatesoverlay.c
+++ b/gtk/inspector/updatesoverlay.c
@@ -68,27 +68,25 @@ gtk_update_free (gpointer data)
}
static void
-gtk_widget_updates_release_widget (GtkWidgetUpdates *updates)
+gtk_widget_updates_free (gpointer data)
{
- g_assert (updates->widget);
+ GtkWidgetUpdates *updates = data;
+
+ g_queue_free_full (updates->updates, gtk_update_free);
+ g_clear_pointer (&updates->last, gsk_render_node_unref);
g_signal_handler_disconnect (updates->widget, updates->unmap_callback);
if (updates->tick_callback)
gtk_widget_remove_tick_callback (updates->widget, updates->tick_callback);
updates->tick_callback = 0;
- updates->widget = NULL;
+
+ g_slice_free (GtkWidgetUpdates, updates);
}
static void
-gtk_widget_updates_free (gpointer data)
+gtk_widget_updates_unmap_widget (GtkWidget *widget,
+ GtkUpdatesOverlay *self)
{
- GtkWidgetUpdates *updates = data;
-
- g_queue_free_full (updates->updates, gtk_update_free);
- g_clear_pointer (&updates->last, gsk_render_node_unref);
- if (updates->widget)
- gtk_widget_updates_release_widget (updates);
-
- g_slice_free (GtkWidgetUpdates, updates);
+ g_hash_table_remove (self->toplevels, widget);
}
static gboolean
@@ -135,7 +133,7 @@ gtk_update_overlay_lookup_for_widget (GtkUpdatesOverlay *self,
updates = g_slice_new0 (GtkWidgetUpdates);
updates->updates = g_queue_new ();
updates->widget = widget;
- updates->unmap_callback = g_signal_connect_swapped (widget, "unmap", G_CALLBACK (gtk_widget_updates_release_widget), updates);
+ updates->unmap_callback = g_signal_connect (widget, "unmap", G_CALLBACK (gtk_widget_updates_unmap_widget), self);
g_hash_table_insert (self->toplevels, g_object_ref (widget), updates);
return updates;
@@ -269,7 +267,7 @@ gtk_updates_overlay_class_init (GtkUpdatesOverlayClass *klass)
static void
gtk_updates_overlay_init (GtkUpdatesOverlay *self)
{
- self->toplevels = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, gtk_widget_updates_free);
+ self->toplevels = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, gtk_widget_updates_free);
}
GtkInspectorOverlay *