diff options
-rw-r--r-- | gtk/gtkdnd.c | 13 |
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); } |