Commit 1865011b authored by Michael Natterer's avatar Michael Natterer 😴

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.
parent bba7a98c
...@@ -4046,7 +4046,6 @@ gtk_drag_update (GtkDragSourceInfo *info, ...@@ -4046,7 +4046,6 @@ gtk_drag_update (GtkDragSourceInfo *info,
static void static void
gtk_drag_end (GtkDragSourceInfo *info, guint32 time) gtk_drag_end (GtkDragSourceInfo *info, guint32 time)
{ {
GdkEvent *send_event;
GtkWidget *source_widget = info->widget; GtkWidget *source_widget = info->widget;
GdkDevice *pointer, *keyboard; GdkDevice *pointer, *keyboard;
...@@ -4091,28 +4090,32 @@ gtk_drag_end (GtkDragSourceInfo *info, guint32 time) ...@@ -4091,28 +4090,32 @@ gtk_drag_end (GtkDragSourceInfo *info, guint32 time)
ungrab_dnd_keys (info->ipc_widget, keyboard, time); ungrab_dnd_keys (info->ipc_widget, keyboard, time);
gtk_device_grab_remove (info->ipc_widget, pointer); gtk_device_grab_remove (info->ipc_widget, pointer);
/* Send on a release pair to the original if (gtk_widget_get_realized (source_widget))
* widget to convince it to release its grab. We need to {
* call gtk_propagate_event() here, instead of GdkEvent *send_event;
* gtk_widget_event() because widget like GtkList may
* expect propagation.
*/
send_event = gdk_event_new (GDK_BUTTON_RELEASE); /* Send on a release pair to the original widget to convince it
send_event->button.window = g_object_ref (gtk_widget_get_root_window (source_widget)); * to release its grab. We need to call gtk_propagate_event()
send_event->button.send_event = TRUE; * here, instead of gtk_widget_event() because widget like
send_event->button.time = time; * GtkList may expect propagation.
send_event->button.x = 0; */
send_event->button.y = 0;
send_event->button.axes = NULL; send_event = gdk_event_new (GDK_BUTTON_RELEASE);
send_event->button.state = 0; send_event->button.window = g_object_ref (gtk_widget_get_root_window (source_widget));
send_event->button.button = info->button; send_event->button.send_event = TRUE;
send_event->button.device = pointer; send_event->button.time = time;
send_event->button.x_root = 0; send_event->button.x = 0;
send_event->button.y_root = 0; send_event->button.y = 0;
send_event->button.axes = NULL;
gtk_propagate_event (source_widget, send_event); send_event->button.state = 0;
gdk_event_free (send_event); 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);
}
} }
/************************************************************* /*************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment