GtkDropTarget

gtk.drop_target.DropTarget is an event controller to receive Drag-and-Drop operations.

The most basic way to use a gtk.drop_target.DropTarget to receive drops on a widget is to create it via gtk.drop_target.DropTarget.new_, passing in the gobject.types.TYPE_FLAG_RESERVED_ID_BIT of the data you want to receive and connect to the gtk.drop_target.DropTarget.drop signal to receive the data:

static gboolean
on_drop (GtkDropTarget *target,
         const GValue  *value,
         double         x,
         double         y,
         gpointer       data)
{
  MyWidget *self = data;

  // Call the appropriate setter depending on the type of data
  // that we received
  if (G_VALUE_HOLDS (value, G_TYPE_FILE))
    my_widget_set_file (self, g_value_get_object (value));
  else if (G_VALUE_HOLDS (value, GDK_TYPE_PIXBUF))
    my_widget_set_pixbuf (self, g_value_get_object (value));
  else
    return FALSE;

  return TRUE;
}

static void
my_widget_init (MyWidget *self)
{
  GtkDropTarget *target =
    gtk_drop_target_new (G_TYPE_INVALID, GDK_ACTION_COPY);

  // This widget accepts two types of drop types: GFile objects
  // and GdkPixbuf objects
  gtk_drop_target_set_gtypes (target, (GType [2]) {
    G_TYPE_FILE,
    GDK_TYPE_PIXBUF,
  }, 2);

  g_signal_connect (target, "drop", G_CALLBACK (on_drop), self);
  gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (target));
}

gtk.drop_target.DropTarget supports more options, such as:

However, gtk.drop_target.DropTarget is ultimately modeled in a synchronous way and only supports data transferred via gobject.types.TYPE_FLAG_RESERVED_ID_BIT. If you want full control over an ongoing drop, the gtk.drop_target_async.DropTargetAsync object gives you this ability.

While a pointer is dragged over the drop target's widget and the drop has not been rejected, that widget will receive the gtk.types.StateFlags.DropActive state, which can be used to style the widget.

If you are not interested in receiving the drop, but just want to update UI state during a Drag-and-Drop operation (e.g. switching tabs), you can use gtk.drop_controller_motion.DropControllerMotion.

struct GtkDropTarget