text: Use gdk_drag_begin

Use gdk_drag_begin directly for one-off drags.
This commit is contained in:
Matthias Clasen
2020-01-06 17:26:05 -05:00
parent 5144d15168
commit 092c115ff0

View File

@@ -67,6 +67,7 @@
#include "gtkactionmuxerprivate.h"
#include "gtkdragsource.h"
#include "gtkdragdest.h"
#include "gtkdragicon.h"
#include "a11y/gtktextaccessible.h"
@@ -179,6 +180,8 @@ struct _GtkTextPrivate
GtkTextHistory *history;
GdkDrag *drag;
float xalign;
int ascent; /* font ascent in pango units */
@@ -2791,14 +2794,15 @@ gtk_text_motion_controller_motion (GtkEventControllerMotion *controller,
}
static void
drag_end (GtkDragSource *source,
GdkDrag *drag,
gboolean delete_data,
GtkText *self)
dnd_finished_cb (GdkDrag *drag,
GtkText *self)
{
g_object_set_data (G_OBJECT (self), "drag-source", NULL);
if (delete_data)
GtkTextPrivate *priv = gtk_text_get_instance_private (self);
if (gdk_drag_get_selected_action (drag) == GDK_ACTION_MOVE)
gtk_text_delete_selection (self);
priv->drag = NULL;
}
static void
@@ -2838,31 +2842,35 @@ gtk_text_drag_gesture_update (GtkGestureDrag *gesture,
int *ranges;
int n_ranges;
char *text;
GdkDragAction actions;
GdkDrag *drag;
GdkPaintable *paintable;
GtkDragSource *source;
text = _gtk_text_get_selected_text (self);
gtk_text_get_pixel_ranges (self, &ranges, &n_ranges);
paintable = gtk_text_util_create_drag_icon (widget, text, -1);
source = gtk_drag_source_new ();
gtk_drag_source_set_content (source, priv->selection_content);
if (priv->editable)
gtk_drag_source_set_actions (source, GDK_ACTION_COPY|GDK_ACTION_MOVE);
gtk_drag_source_set_icon (source,
paintable,
priv->drag_start_x - ranges[0],
priv->drag_start_y);
g_signal_connect_swapped (source, "drag-end", G_CALLBACK (drag_end), self);
g_object_set_data_full (G_OBJECT (self), "drag-source", source, g_object_unref);
actions = GDK_ACTION_COPY|GDK_ACTION_MOVE;
else
actions = GDK_ACTION_COPY;
gtk_drag_source_drag_begin (source,
widget,
gdk_event_get_device ((GdkEvent*) event),
priv->drag_start_x + ranges[0],
priv->drag_start_y);
g_object_unref (paintable);
drag = gdk_drag_begin (gdk_event_get_surface ((GdkEvent*) event),
gdk_event_get_device ((GdkEvent*) event),
priv->selection_content,
actions,
priv->drag_start_x,
priv->drag_start_y);
g_signal_connect (drag, "dnd-finished", G_CALLBACK (dnd_finished_cb), self);
paintable = gtk_text_util_create_drag_icon (widget, text, -1);
gtk_drag_icon_set_from_paintable (drag, paintable, ranges[0], 0);
g_clear_object (&paintable);
priv->drag = drag;
g_object_unref (drag);
g_free (ranges);
g_free (text);
@@ -6123,17 +6131,13 @@ static GdkDragAction
gtk_text_get_action (GtkText *self,
GdkDrop *drop)
{
GtkTextPrivate *priv = gtk_text_get_instance_private (self);
GdkDrag *drag = gdk_drop_get_drag (drop);
GtkDragSource *source;
GtkDragSource *source1;
GdkDragAction actions;
actions = gdk_drop_get_actions (drop);
source = drag ? gtk_drag_get_source (drag) : NULL;
source1 = (GtkDragSource*)g_object_get_data (G_OBJECT (self), "drag-source");
if (source && source == source1 &&
if (drag == priv->drag &&
actions & GDK_ACTION_MOVE)
return GDK_ACTION_MOVE;