mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-09-30 11:07:38 +00:00
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.
This commit is contained in:
parent
64adba6e3e
commit
28f82afd0e
45
gtk/gtkdnd.c
45
gtk/gtkdnd.c
@ -4071,7 +4071,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;
|
||||||
GdkDisplay *display = gtk_widget_get_display (source_widget);
|
GdkDisplay *display = gtk_widget_get_display (source_widget);
|
||||||
|
|
||||||
@ -4113,28 +4112,32 @@ gtk_drag_end (GtkDragSourceInfo *info, guint32 time)
|
|||||||
ungrab_dnd_keys (info->ipc_widget, time);
|
ungrab_dnd_keys (info->ipc_widget, time);
|
||||||
gtk_grab_remove (info->ipc_widget);
|
gtk_grab_remove (info->ipc_widget);
|
||||||
|
|
||||||
/* 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->button.state = 0;
|
|
||||||
send_event->button.button = info->button;
|
|
||||||
send_event->button.device = gdk_display_get_core_pointer (display);
|
|
||||||
send_event->button.x_root = 0;
|
|
||||||
send_event->button.y_root = 0;
|
|
||||||
|
|
||||||
gtk_propagate_event (source_widget, send_event);
|
send_event = gdk_event_new (GDK_BUTTON_RELEASE);
|
||||||
gdk_event_free (send_event);
|
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 = gdk_display_get_core_pointer (display);
|
||||||
|
send_event->button.x_root = 0;
|
||||||
|
send_event->button.y_root = 0;
|
||||||
|
|
||||||
|
gtk_propagate_event (source_widget, send_event);
|
||||||
|
gdk_event_free (send_event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user