diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-12-30 21:43:22 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-01-08 18:48:19 -0500 |
commit | 2612331282c954e77e291d8f2aa3526e02a6021b (patch) | |
tree | 4342c002c6b4cbc9fb81a13aeb21cfc1bc422060 | |
parent | d3fd071809f3698d911ee01de3b91b7bde993119 (diff) | |
download | gtk+-2612331282c954e77e291d8f2aa3526e02a6021b.tar.gz |
label: Port to GtkDragSource
-rw-r--r-- | gtk/gtklabel.c | 100 |
1 files changed, 17 insertions, 83 deletions
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index b8d8d1cf6f..182ebcea1e 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -54,6 +54,7 @@ #include "gtkwindow.h" #include "gtkpopovermenu.h" #include "gtknative.h" +#include "gtkdragsource.h" #include "a11y/gtklabelaccessibleprivate.h" @@ -501,9 +502,6 @@ static gboolean gtk_label_mnemonic_activate (GtkWidget *widget, static void gtk_label_setup_mnemonic (GtkLabel *label, GtkWidget *toplevel, guint last_key); -static void gtk_label_drag_data_get (GtkWidget *widget, - GdkDrag *drag, - GtkSelectionData *selection_data); static void gtk_label_buildable_interface_init (GtkBuildableIface *iface); static gboolean gtk_label_buildable_custom_tag_start (GtkBuildable *buildable, @@ -652,7 +650,6 @@ gtk_label_class_init (GtkLabelClass *class) widget_class->unroot = gtk_label_unroot; widget_class->mnemonic_activate = gtk_label_mnemonic_activate; widget_class->popup_menu = gtk_label_popup_menu; - widget_class->drag_data_get = gtk_label_drag_data_get; widget_class->grab_focus = gtk_label_grab_focus; widget_class->focus = gtk_label_focus; widget_class->get_request_mode = gtk_label_get_request_mode; @@ -4597,16 +4594,10 @@ connect_mnemonics_visible_notify (GtkLabel *label) } } -static void -drag_begin_cb (GtkWidget *widget, - GdkDrag *drag, - gpointer data) +static GdkPaintable * +get_selection_paintable (GtkLabel *label) { - GtkLabel *label = GTK_LABEL (widget); GtkLabelPrivate *priv = gtk_label_get_instance_private (label); - GdkPaintable *paintable = NULL; - - g_signal_handlers_disconnect_by_func (widget, drag_begin_cb, NULL); if ((priv->select_info->selection_anchor != priv->select_info->selection_end) && @@ -4628,20 +4619,10 @@ drag_begin_cb (GtkWidget *widget, if (start > len) start = len; - paintable = gtk_text_util_create_drag_icon (widget, - priv->text + start, - end - start); + return gtk_text_util_create_drag_icon (GTK_WIDGET (label), priv->text + start, end - start); } - if (paintable) - { - gtk_drag_set_icon_paintable (drag, paintable, 0, 0); - g_object_unref (paintable); - } - else - { - gtk_drag_set_icon_default (drag); - } + return NULL; } static void @@ -4734,27 +4715,21 @@ gtk_label_drag_gesture_update (GtkGestureDrag *gesture, if (info->in_drag) { - if (gtk_drag_check_threshold (widget, - info->drag_start_x, - info->drag_start_y, - x, y)) + if (gtk_drag_check_threshold (widget, info->drag_start_x, info->drag_start_y, x, y)) { - GdkContentFormats *target_list = gdk_content_formats_new (NULL, 0); - - target_list = gtk_content_formats_add_text_targets (target_list); - - g_signal_connect (widget, "drag-begin", - G_CALLBACK (drag_begin_cb), NULL); - gtk_drag_begin (widget, - gtk_gesture_get_device (GTK_GESTURE (gesture)), - target_list, - GDK_ACTION_COPY, - info->drag_start_x, - info->drag_start_y); + GtkDragSource *source; + GdkPaintable *paintable; + GdkDevice *device; + + source = gtk_drag_source_new (info->provider, GDK_ACTION_COPY); + paintable = get_selection_paintable (label); + gtk_drag_source_set_icon (source, paintable, 9, 0); + g_clear_object (&paintable); + device = gtk_gesture_get_device (GTK_GESTURE (gesture)); + gtk_drag_source_drag_begin (source, widget, device, info->drag_start_x, info->drag_start_y); + g_object_unref (source); info->in_drag = FALSE; - - gdk_content_formats_unref (target_list); } } else @@ -5141,47 +5116,6 @@ gtk_label_get_selectable (GtkLabel *label) } static void -gtk_label_set_selection_text (GtkLabel *label, - GtkSelectionData *selection_data) -{ - GtkLabelPrivate *priv = gtk_label_get_instance_private (label); - - if (priv->select_info && - (priv->select_info->selection_anchor != - priv->select_info->selection_end) && - priv->text) - { - gint start, end; - gint len; - - start = MIN (priv->select_info->selection_anchor, - priv->select_info->selection_end); - end = MAX (priv->select_info->selection_anchor, - priv->select_info->selection_end); - - len = strlen (priv->text); - - if (end > len) - end = len; - - if (start > len) - start = len; - - gtk_selection_data_set_text (selection_data, - priv->text + start, - end - start); - } -} - -static void -gtk_label_drag_data_get (GtkWidget *widget, - GdkDrag *drag, - GtkSelectionData *selection_data) -{ - gtk_label_set_selection_text (GTK_LABEL (widget), selection_data); -} - -static void gtk_label_select_region_index (GtkLabel *label, gint anchor_index, gint end_index) |