DragSource
GtkDragSource
is an event controller to initiate Drag-And-Drop operations.
GtkDragSource
can be set up with the necessary ingredients for a DND operation ahead of time. This includes the source for the data that is being transferred, in the form of a class@Gdk.ContentProvider, the desired action, and the icon to use during the drag operation. After setting it up, the drag source must be added to a widget as an event controller, using method@Gtk.Widget.add_controller.
static void
my_widget_init (MyWidget *self)
{
GtkDragSource *drag_source = gtk_drag_source_new ();
g_signal_connect (drag_source, "prepare", G_CALLBACK (on_drag_prepare), self);
g_signal_connect (drag_source, "drag-begin", G_CALLBACK (on_drag_begin), self);
gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (drag_source));
}
Setting up the content provider and icon ahead of time only makes sense when the data does not change. More commonly, you will want to set them up just in time. To do so, GtkDragSource
has signal@Gtk.DragSource::prepare and signal@Gtk.DragSource::drag-begin signals.
The ::prepare signal is emitted before a drag is started, and can be used to set the content provider and actions that the drag should be started with.
static GdkContentProvider *
on_drag_prepare (GtkDragSource *source,
double x,
double y,
MyWidget *self)
{
// This widget supports two types of content: GFile objects
// and GdkPixbuf objects; GTK will handle the serialization
// of these types automatically
GFile *file = my_widget_get_file (self);
GdkPixbuf *pixbuf = my_widget_get_pixbuf (self);
return gdk_content_provider_new_union ((GdkContentProvider *[2]) {
gdk_content_provider_new_typed (G_TYPE_FILE, file),
gdk_content_provider_new_typed (GDK_TYPE_PIXBUF, pixbuf),
}, 2);
}
The ::drag-begin signal is emitted after the GdkDrag
object has been created, and can be used to set up the drag icon.
static void
on_drag_begin (GtkDragSource *source,
GdkDrag *drag,
MyWidget *self)
{
// Set the widget as the drag icon
GdkPaintable *paintable = gtk_widget_paintable_new (GTK_WIDGET (self));
gtk_drag_source_set_icon (source, paintable, 0, 0);
g_object_unref (paintable);
}
During the DND operation, GtkDragSource
emits signals that can be used to obtain updates about the status of the operation, but it is not normally necessary to connect to any signals, except for one case: when the supported actions include %GDK_ACTION_MOVE, you need to listen for the signal@Gtk.DragSource::drag-end signal and delete the data after it has been transferred.
Constructors
Properties
Functions
Emitted when the gesture is recognized.
Emitted whenever a sequence is cancelled.
Emitted on the drag source when a drag is started.
Emitted on the drag source when a drag has failed.
Emitted on the drag source when a drag is finished.
Emitted when @gesture either stopped recognizing the event sequences as something to be handled, or the number of touch sequences became higher or lower than property@Gtk.Gesture:n-points.
Emitted when a drag is about to be initiated.
Emitted whenever a sequence state changes.
Emitted whenever an event is handled while the gesture is recognized.
Cancels a currently ongoing drag operation.
If there are touch sequences being currently handled by @gesture, returns true and fills in @rect with the bounding box containing all active touches.
Returns the button number currently interacting with @gesture, or 0 if there is none.
Returns the event that is currently being handled by the controller.
Returns the device of the event that is currently being handled by the controller.
Returns the modifier state of the event that is currently being handled by the controller.
Returns the timestamp of the event that is currently being handled by the controller.
Returns the event sequence currently interacting with @gesture.
Returns the last event that was processed for @sequence.
Returns the GdkEventSequence
that was last updated on @gesture.
Returns the list of GdkEventSequences
currently being interpreted by @gesture.
Returns the @sequence state, as seen by @gesture.
Returns true if @gesture is currently handling events corresponding to @sequence.
Returns true if both gestures pertain to the same group.
Returns true if the gesture is currently recognized.
Sets the state of @sequence in @gesture.
Sets the state of all sequences that @gesture is currently interacting with.
Sets a name on the controller that can be used for debugging.