From e9203eeef7145c40065728dd2fa4e80035cfd6ef Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 31 Dec 2019 08:20:54 -0500 Subject: [PATCH] text: Convert to GtkDragSource --- gtk/gtktext.c | 131 +++++++++++++++----------------------------------- 1 file changed, 39 insertions(+), 92 deletions(-) diff --git a/gtk/gtktext.c b/gtk/gtktext.c index b9a763352e..fd8a449399 100644 --- a/gtk/gtktext.c +++ b/gtk/gtktext.c @@ -67,6 +67,7 @@ #include "gtkwindow.h" #include "gtknative.h" #include "gtkactionmuxerprivate.h" +#include "gtkdragsource.h" #include "a11y/gtktextaccessible.h" @@ -344,15 +345,6 @@ static void gtk_text_drag_leave (GtkWidget *widget, static void gtk_text_drag_data_received (GtkWidget *widget, GdkDrop *drop, GtkSelectionData *selection_data); -static void gtk_text_drag_data_get (GtkWidget *widget, - GdkDrag *drag, - GtkSelectionData *selection_data); -static void gtk_text_drag_data_delete (GtkWidget *widget, - GdkDrag *drag); -static void gtk_text_drag_begin (GtkWidget *widget, - GdkDrag *drag); -static void gtk_text_drag_end (GtkWidget *widget, - GdkDrag *drag); /* GtkEditable method implementations @@ -729,8 +721,6 @@ gtk_text_class_init (GtkTextClass *class) widget_class->snapshot = gtk_text_snapshot; widget_class->grab_focus = gtk_text_grab_focus; widget_class->style_updated = gtk_text_style_updated; - widget_class->drag_begin = gtk_text_drag_begin; - widget_class->drag_end = gtk_text_drag_end; widget_class->direction_changed = gtk_text_direction_changed; widget_class->state_flags_changed = gtk_text_state_flags_changed; widget_class->root = gtk_text_root; @@ -740,8 +730,6 @@ gtk_text_class_init (GtkTextClass *class) widget_class->drag_motion = gtk_text_drag_motion; widget_class->drag_leave = gtk_text_drag_leave; widget_class->drag_data_received = gtk_text_drag_data_received; - widget_class->drag_data_get = gtk_text_drag_data_get; - widget_class->drag_data_delete = gtk_text_drag_data_delete; class->move_cursor = gtk_text_move_cursor; class->insert_at_cursor = gtk_text_insert_at_cursor; @@ -2803,6 +2791,12 @@ gtk_text_motion_controller_motion (GtkEventControllerMotion *controller, } } +static void +drag_end (GtkText *self) +{ + g_object_set_data (G_OBJECT (self), "drag-source", NULL); +} + static void gtk_text_drag_gesture_update (GtkGestureDrag *gesture, double offset_x, @@ -2839,23 +2833,38 @@ gtk_text_drag_gesture_update (GtkGestureDrag *gesture, { int *ranges; int n_ranges; - GdkContentFormats *target_list = gdk_content_formats_new (NULL, 0); - guint actions = priv->editable ? GDK_ACTION_COPY | GDK_ACTION_MOVE : GDK_ACTION_COPY; - - target_list = gtk_content_formats_add_text_targets (target_list); + char *text; + GdkPaintable *paintable; + GtkDragSource *source; + text = _gtk_text_get_selected_text (self); gtk_text_get_pixel_ranges (self, &ranges, &n_ranges); - gtk_drag_begin (widget, - gdk_event_get_device ((GdkEvent*) event), - target_list, actions, - priv->drag_start_x + ranges[0], - priv->drag_start_y); + paintable = gtk_text_util_create_drag_icon (widget, text, -1); + + source = gtk_drag_source_new (priv->selection_content, + priv->editable ? GDK_ACTION_COPY | GDK_ACTION_MOVE + : GDK_ACTION_COPY); + gtk_drag_source_set_icon (source, + paintable, + priv->drag_start_x - ranges[0], + priv->drag_start_y); + g_signal_connect_swapped (source, "drag-data-delete", + G_CALLBACK (gtk_text_delete_selection), self); + 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); + + 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); g_free (ranges); + g_free (text); priv->in_drag = FALSE; - - gdk_content_formats_unref (target_list); } } else @@ -6096,41 +6105,6 @@ gtk_text_selection_bubble_popup_set (GtkText *self) g_source_set_name_by_id (priv->selection_bubble_timeout_id, "[gtk] gtk_text_selection_bubble_popup_cb"); } -static void -gtk_text_drag_begin (GtkWidget *widget, - GdkDrag *drag) -{ - GtkText *self = GTK_TEXT (widget); - GtkTextPrivate *priv = gtk_text_get_instance_private (self); - char *text; - - text = _gtk_text_get_selected_text (self); - - if (self) - { - int *ranges, n_ranges; - GdkPaintable *paintable; - - paintable = gtk_text_util_create_drag_icon (widget, text, -1); - gtk_text_get_pixel_ranges (self, &ranges, &n_ranges); - - gtk_drag_set_icon_paintable (drag, - paintable, - priv->drag_start_x - ranges[0], - priv->drag_start_y); - - g_free (ranges); - g_object_unref (paintable); - g_free (text); - } -} - -static void -gtk_text_drag_end (GtkWidget *widget, - GdkDrag *drag) -{ -} - static void gtk_text_drag_leave (GtkWidget *widget, GdkDrop *drop) @@ -6220,14 +6194,17 @@ static GdkDragAction gtk_text_get_action (GtkText *self, GdkDrop *drop) { - GtkWidget *widget = GTK_WIDGET (self); GdkDrag *drag = gdk_drop_get_drag (drop); - GtkWidget *source_widget = gtk_drag_get_source_widget (drag); + GtkDragSource *source; + GtkDragSource *source1; GdkDragAction actions; actions = gdk_drop_get_actions (drop); - if (source_widget == widget && + source = drag ? gtk_drag_get_source (drag) : NULL; + source1 = (GtkDragSource*)g_object_get_data (G_OBJECT (self), "drag-source"); + + if (source && source == source1 && actions & GDK_ACTION_MOVE) return GDK_ACTION_MOVE; @@ -6288,36 +6265,6 @@ gtk_text_drag_data_received (GtkWidget *widget, g_free (str); } -static void -gtk_text_drag_data_get (GtkWidget *widget, - GdkDrag *drag, - GtkSelectionData *selection_data) -{ - GtkText *self = GTK_TEXT (widget); - GtkTextPrivate *priv = gtk_text_get_instance_private (self); - - if (priv->selection_bound != priv->current_pos) - { - char *str = gtk_text_get_display_text (self, priv->selection_bound, priv->current_pos); - - gtk_selection_data_set_text (selection_data, str, -1); - - g_free (str); - } -} - -static void -gtk_text_drag_data_delete (GtkWidget *widget, - GdkDrag *drag) -{ - GtkText *self = GTK_TEXT (widget); - GtkTextPrivate *priv = gtk_text_get_instance_private (self); - - if (priv->editable && - priv->selection_bound != priv->current_pos) - gtk_text_delete_selection (self); -} - /* We display the cursor when * * - the selection is empty, AND