summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkdnd.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index 48be48c355..a055c308d2 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -2501,6 +2501,13 @@ gtk_drag_begin (GtkWidget *widget,
}
static void
+icon_widget_destroyed (GtkWidget *widget,
+ GtkDragSourceInfo *info)
+{
+ g_clear_object (&info->icon_widget);
+}
+
+static void
gtk_drag_set_icon_widget_internal (GdkDragContext *context,
GtkWidget *widget,
gint hot_x,
@@ -2530,6 +2537,8 @@ gtk_drag_set_icon_widget_internal (GdkDragContext *context,
if (!widget)
goto out;
+ g_signal_connect (widget, "destroy", G_CALLBACK (icon_widget_destroyed), info);
+
gdk_drag_context_set_hotspot (context, hot_x, hot_y);
if (!info->icon_window)
@@ -3204,11 +3213,15 @@ gtk_drag_remove_icon (GtkDragSourceInfo *info)
widget = info->icon_widget;
info->icon_widget = NULL;
+ g_signal_handlers_disconnect_by_func (widget, icon_widget_destroyed, info);
+
gtk_widget_hide (widget);
gtk_widget_set_opacity (widget, 1.0);
if (info->destroy_icon)
gtk_widget_destroy (widget);
+ else
+ gtk_container_remove (GTK_CONTAINER (info->icon_window), widget);
g_object_unref (widget);
}