summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Natterer <mitch@gimp.org>2011-02-11 10:35:25 +0100
committerMichael Natterer <mitch@gimp.org>2011-02-11 10:48:43 +0100
commit1865011b7fe884ecef4bbca93de6fd0d34bd9209 (patch)
tree093aecfb3676cbf22b4593e4014477d6c3360c6e
parentbba7a98cc63162b694ee6d0eff3e81a83ab90b88 (diff)
downloadgtk+-1865011b7fe884ecef4bbca93de6fd0d34bd9209.tar.gz
gtk: don't send BUTTON_RELEASE to unrealized widgets
which happened when the source widget was hidden or destroyed while a drag was going on, like when dragging from a popup that got a grab broken as result of the dnd operation.
-rw-r--r--gtk/gtkdnd.c47
1 files changed, 25 insertions, 22 deletions
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index 8c074c9d8d..f75b2f56b4 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -4046,7 +4046,6 @@ gtk_drag_update (GtkDragSourceInfo *info,
static void
gtk_drag_end (GtkDragSourceInfo *info, guint32 time)
{
- GdkEvent *send_event;
GtkWidget *source_widget = info->widget;
GdkDevice *pointer, *keyboard;
@@ -4091,28 +4090,32 @@ gtk_drag_end (GtkDragSourceInfo *info, guint32 time)
ungrab_dnd_keys (info->ipc_widget, keyboard, time);
gtk_device_grab_remove (info->ipc_widget, pointer);
- /* 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
- * gtk_widget_event() because widget like GtkList may
- * expect propagation.
- */
+ if (gtk_widget_get_realized (source_widget))
+ {
+ GdkEvent *send_event;
- send_event = gdk_event_new (GDK_BUTTON_RELEASE);
- send_event->button.window = g_object_ref (gtk_widget_get_root_window (source_widget));
- send_event->button.send_event = TRUE;
- send_event->button.time = time;
- send_event->button.x = 0;
- send_event->button.y = 0;
- send_event->button.axes = NULL;
- send_event->button.state = 0;
- send_event->button.button = info->button;
- send_event->button.device = pointer;
- send_event->button.x_root = 0;
- send_event->button.y_root = 0;
-
- gtk_propagate_event (source_widget, send_event);
- gdk_event_free (send_event);
+ /* 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 gtk_widget_event() because widget like
+ * GtkList may expect propagation.
+ */
+
+ send_event = gdk_event_new (GDK_BUTTON_RELEASE);
+ send_event->button.window = g_object_ref (gtk_widget_get_root_window (source_widget));
+ send_event->button.send_event = TRUE;
+ send_event->button.time = time;
+ send_event->button.x = 0;
+ send_event->button.y = 0;
+ send_event->button.axes = NULL;
+ send_event->button.state = 0;
+ send_event->button.button = info->button;
+ send_event->button.device = pointer;
+ send_event->button.x_root = 0;
+ send_event->button.y_root = 0;
+
+ gtk_propagate_event (source_widget, send_event);
+ gdk_event_free (send_event);
+ }
}
/*************************************************************