]> Pileus Git - ~andy/gtk/commitdiff
gtk: don't send BUTTON_RELEASE to unrealized widgets
authorMichael Natterer <mitch@gimp.org>
Fri, 11 Feb 2011 09:35:25 +0000 (10:35 +0100)
committerMichael Natterer <mitch@gimp.org>
Fri, 11 Feb 2011 09:48:43 +0000 (10:48 +0100)
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.

gtk/gtkdnd.c

index 8c074c9d8da5f22313c566ba1a7b637232648872..f75b2f56b4cf05fece057410927eaaa3c9a2daa3 100644 (file)
@@ -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);
+    }
 }
 
 /*************************************************************