diff options
author | Michael Natterer <mitch@gimp.org> | 2011-02-11 10:35:25 +0100 |
---|---|---|
committer | Michael Natterer <mitch@gimp.org> | 2011-02-11 10:48:43 +0100 |
commit | 1865011b7fe884ecef4bbca93de6fd0d34bd9209 (patch) | |
tree | 093aecfb3676cbf22b4593e4014477d6c3360c6e /gtk/gtkdnd.c | |
parent | bba7a98cc63162b694ee6d0eff3e81a83ab90b88 (diff) | |
download | gtk+-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.
Diffstat (limited to 'gtk/gtkdnd.c')
-rw-r--r-- | gtk/gtkdnd.c | 47 |
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); + } } /************************************************************* |