dnd: Guard drags with a reference when finishing
authorBenjamin Otte <otte@redhat.com>
Mon, 26 Jul 2021 00:16:47 +0000 (02:16 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 26 Jul 2021 00:18:54 +0000 (02:18 +0200)
Usually the "dnd-finished" signal will be used to unref the GdkDrag. In
those cases, we would lose the object, so that when we do the final
drag_drop_done() afterwards, we wouldn't have a remaining reference.

With the reference guard, this now works.

gdk/macos/gdkmacosdrag.c
gdk/wayland/gdkdrag-wayland.c
gdk/x11/gdkdrag-x11.c

index ee4b5e7020990a08d4f4448726b5ea87b5a270ba..0eb246bd0b9e014319fec8f6bb8d883edfce7baf 100644 (file)
@@ -242,9 +242,11 @@ gdk_macos_drag_drop_performed (GdkDrag *drag,
 
   g_assert (GDK_IS_MACOS_DRAG (self));
 
+  g_object_ref (self);
   drag_ungrab (self);
   g_signal_emit_by_name (drag, "dnd-finished");
   gdk_drag_drop_done (drag, TRUE);
+  g_object_unref (self);
 }
 
 static void
index 8a8c4cc058f96218e67f8d9b5d270a889b7feeb3..55521353c392f86f1fed22b7a7826e5a2f795437 100644 (file)
@@ -290,8 +290,10 @@ data_source_dnd_finished (void                  *data,
 {
   GdkDrag *drag = data;
 
+  g_object_ref (drag);
   g_signal_emit_by_name (drag, "dnd-finished");
   gdk_drag_drop_done (drag, TRUE);
+  g_object_unref (drag);
 }
 
 static void
index 88e65a2a2c982a36d0eeb7392b3b4e4c3ccf8cf0..f4b752306e4889cb21e14d8d63f931df2b1d68df 100644 (file)
@@ -884,8 +884,10 @@ gdk_x11_drag_handle_finished (GdkDisplay   *display,
       if (drag_x11->version == 5)
         drag_x11->drop_failed = xevent->xclient.data.l[1] == 0;
 
+      g_object_ref (drag);
       g_signal_emit_by_name (drag, "dnd-finished");
       gdk_drag_drop_done (drag, !drag_x11->drop_failed);
+      g_object_unref (drag);
     }
 }