summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2006-11-18 04:37:33 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2006-11-18 04:37:33 +0000
commit1312c002df0c907c490725564aac8f1a3717bd6a (patch)
tree83853b047cf7e50ff07b95298df2a435ebd22032
parent52ae260503fda134e5891ed7159cf3ada353f2c2 (diff)
downloadgtk+-1312c002df0c907c490725564aac8f1a3717bd6a.tar.gz
Fix problems with drag cancellation. (#376535, Michael Natterer)
2006-11-17 Matthias Clasen <mclasen@redhat.com> Fix problems with drag cancellation. (#376535, Michael Natterer) * gtk/gtkdnd.c (gtk_drag_source_info_destroy): Disconnect signal handlers before emitting drag-end. (gtk_drag_end): Disconnect signal handlers before removing the grab.
-rw-r--r--ChangeLog9
-rw-r--r--gtk/gtkdnd.c28
2 files changed, 24 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index ce64653673..7857361cc0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-11-17 Matthias Clasen <mclasen@redhat.com>
+
+ Fix problems with drag cancellation. (#376535, Michael Natterer)
+
+ * gtk/gtkdnd.c (gtk_drag_source_info_destroy): Disconnect signal
+ handlers before emitting drag-end.
+ (gtk_drag_end): Disconnect signal handlers before removing
+ the grab.
+
2006-11-16 Mariano Suárez-Alvarez <mariano@gnome.org>
* gtk/gtkcellrenderertext.c (gtk_cell_renderer_text_class_init):
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index 3ebfd9c0b7..a3559137e0 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -3753,15 +3753,10 @@ gtk_drag_source_info_destroy (GtkDragSourceInfo *info)
gtk_drag_remove_icon (info);
if (info->icon_pixbuf)
- g_object_unref (info->icon_pixbuf);
-
- if (!info->proxy_dest)
- g_signal_emit_by_name (info->widget, "drag_end",
- info->context);
-
- if (info->widget)
- g_object_unref (info->widget);
-
+ {
+ g_object_unref (info->icon_pixbuf);
+ info->icon_pixbuf = NULL;
+ }
g_signal_handlers_disconnect_by_func (info->ipc_widget,
gtk_drag_grab_broken_event_cb,
@@ -3782,6 +3777,13 @@ gtk_drag_source_info_destroy (GtkDragSourceInfo *info)
gtk_drag_selection_get,
info);
+ if (!info->proxy_dest)
+ g_signal_emit_by_name (info->widget, "drag_end",
+ info->context);
+
+ if (info->widget)
+ g_object_unref (info->widget);
+
gtk_selection_remove_all (info->ipc_widget);
g_object_set_data (G_OBJECT (info->ipc_widget), I_("gtk-info"), NULL);
source_widgets = g_slist_remove (source_widgets, info->ipc_widget);
@@ -3926,10 +3928,6 @@ gtk_drag_end (GtkDragSourceInfo *info, guint32 time)
info->have_grab = FALSE;
- gdk_display_pointer_ungrab (display, time);
- gdk_display_keyboard_ungrab (display, time);
- gtk_grab_remove (info->ipc_widget);
-
g_signal_handlers_disconnect_by_func (info->ipc_widget,
gtk_drag_grab_broken_event_cb,
info);
@@ -3946,6 +3944,10 @@ gtk_drag_end (GtkDragSourceInfo *info, guint32 time)
gtk_drag_key_cb,
info);
+ gdk_display_pointer_ungrab (display, time);
+ gdk_display_keyboard_ungrab (display, time);
+ gtk_grab_remove (info->ipc_widget);
+
/* Send on a release pair to the original
* widget to convince it to release its grab. We need to
* call gtk_propagate_event() here, instead of