[gtk/dnd-gestures: 8/29] entry: Port icon dnd to GtkDragSource



commit f6144edc4c2213b229b4e18c66ab1cf0020029b4
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Dec 31 02:45:02 2019 -0500

    entry: Port icon dnd to GtkDragSource
    
    This requires a small change in the api,
    since we need to provide a GdkContentProvider now.

 gtk/gtkentry.c         | 38 +++++++++++++++++++-------------------
 gtk/gtkentry.h         |  2 +-
 tests/testentryicons.c | 43 +++++++++----------------------------------
 3 files changed, 29 insertions(+), 54 deletions(-)
---
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index e4e41bf535..6ac3162522 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -70,6 +70,8 @@
 #include "gtkwindow.h"
 #include "gtknative.h"
 #include "gtkgestureclick.h"
+#include "gtkdragsource.h"
+#include "gtkwidgetpaintable.h"
 
 #include "a11y/gtkentryaccessible.h"
 
@@ -172,7 +174,7 @@ struct _EntryIconInfo
   guint in_drag        : 1;
 
   GdkDragAction actions;
-  GdkContentFormats *target_list;
+  GdkContentProvider *content;
 };
 
 enum {
@@ -1320,8 +1322,7 @@ gtk_entry_finalize (GObject *object)
       if (icon_info == NULL)
         continue;
 
-      if (icon_info->target_list != NULL)
-        gdk_content_formats_unref (icon_info->target_list);
+      g_clear_object (&icon_info->content);
 
       gtk_widget_unparent (icon_info->widget);
 
@@ -1462,17 +1463,21 @@ icon_drag_update_cb (GtkGestureDrag *gesture,
   pos = get_icon_position_from_controller (entry, GTK_EVENT_CONTROLLER (gesture));
   icon_info = priv->icons[pos];
 
-  if (icon_info->target_list != NULL &&
-      gtk_drag_check_threshold (icon_info->widget,
-                                start_x, start_y,
-                                x, y))
+  if (icon_info->content != NULL &&
+      gtk_drag_check_threshold (icon_info->widget, start_x, start_y, x, y))
     {
+      GtkDragSource *source;
+      GdkPaintable *paintable;
+      GdkDevice *device;
+
       icon_info->in_drag = TRUE;
-      gtk_drag_begin (GTK_WIDGET (entry),
-                      gtk_gesture_get_device (GTK_GESTURE (gesture)),
-                      icon_info->target_list,
-                      icon_info->actions,
-                      start_x, start_y);
+      source = gtk_drag_source_new (icon_info->content, icon_info->actions);
+      paintable = gtk_widget_paintable_new (icon_info->widget);
+      gtk_drag_source_set_icon (source, paintable, -2, -2);
+      g_object_unref (paintable);
+      device = gtk_gesture_get_device (GTK_GESTURE (gesture));
+      gtk_drag_source_drag_begin (source, GTK_WIDGET (entry), device, start_x, start_y);
+      g_object_unref (source);
     }
 }
 
@@ -2742,7 +2747,7 @@ gtk_entry_get_icon_at_pos (GtkEntry *entry,
 void
 gtk_entry_set_icon_drag_source (GtkEntry             *entry,
                                 GtkEntryIconPosition  icon_pos,
-                                GdkContentFormats    *formats,
+                                GdkContentProvider   *provider,
                                 GdkDragAction         actions)
 {
   GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
@@ -2754,12 +2759,7 @@ gtk_entry_set_icon_drag_source (GtkEntry             *entry,
   if ((icon_info = priv->icons[icon_pos]) == NULL)
     icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos);
 
-  if (icon_info->target_list)
-    gdk_content_formats_unref (icon_info->target_list);
-  icon_info->target_list = formats;
-  if (icon_info->target_list)
-    gdk_content_formats_ref (icon_info->target_list);
-
+  g_set_object (&icon_info->content, provider);
   icon_info->actions = actions;
 }
 
diff --git a/gtk/gtkentry.h b/gtk/gtkentry.h
index fca03bc2b8..e7e4853a54 100644
--- a/gtk/gtkentry.h
+++ b/gtk/gtkentry.h
@@ -266,7 +266,7 @@ gchar *      gtk_entry_get_icon_tooltip_markup           (GtkEntry             *
 GDK_AVAILABLE_IN_ALL
 void         gtk_entry_set_icon_drag_source              (GtkEntry             *entry,
                                                          GtkEntryIconPosition  icon_pos,
-                                                         GdkContentFormats    *formats,
+                                                         GdkContentProvider   *content,
                                                          GdkDragAction         actions);
 GDK_AVAILABLE_IN_ALL
 gint         gtk_entry_get_current_icon_drag_source      (GtkEntry             *entry);
diff --git a/tests/testentryicons.c b/tests/testentryicons.c
index 83f81dbaab..e5af8e6c85 100644
--- a/tests/testentryicons.c
+++ b/tests/testentryicons.c
@@ -20,33 +20,6 @@ drag_begin_cb (GtkWidget      *widget,
     gtk_drag_set_icon_name (drag, "dialog-information", 2, 2);
 }
 
-static void
-drag_data_get_cb (GtkWidget        *widget,
-                  GdkDrag          *drag,
-                  GtkSelectionData *data,
-                  gpointer          user_data)
-{
-  gint pos;
-
-  pos = gtk_entry_get_current_icon_drag_source (GTK_ENTRY (widget));
-
-  if (pos == GTK_ENTRY_ICON_PRIMARY)
-    {
-      gint start, end;
-
-      if (gtk_editable_get_selection_bounds (GTK_EDITABLE (widget), &start, &end))
-        {
-          gchar *str;
-
-          str = gtk_editable_get_chars (GTK_EDITABLE (widget), start, end);
-          gtk_selection_data_set_text (data, str, -1);
-          g_free (str);
-        }
-      else
-        gtk_selection_data_set_text (data, "XXX", -1);
-    }
-}
-
 static void
 set_blank (GtkWidget *button,
            GtkEntry  *entry)
@@ -127,7 +100,8 @@ main (int argc, char **argv)
   GtkWidget *button3;
   GtkWidget *button4;
   GIcon *icon;
-  GdkContentFormats *tlist;
+  GdkContentProvider *content;
+  GValue value = G_VALUE_INIT;
 
   gtk_init ();
 
@@ -189,16 +163,17 @@ main (int argc, char **argv)
   gtk_entry_set_icon_tooltip_text (GTK_ENTRY (entry),
                                   GTK_ENTRY_ICON_PRIMARY,
                                   "Save a file");
-  tlist = gdk_content_formats_new (NULL, 0);
-  tlist = gtk_content_formats_add_text_targets (tlist);
+ 
+  g_value_init (&value, G_TYPE_STRING);
+  g_value_set_string (&value, "Amazing");
+  content = gdk_content_provider_new_for_value (&value);
+  g_value_unset (&value);
   gtk_entry_set_icon_drag_source (GTK_ENTRY (entry),
                                   GTK_ENTRY_ICON_PRIMARY,
-                                  tlist, GDK_ACTION_COPY); 
+                                  content, GDK_ACTION_COPY); 
   g_signal_connect_after (entry, "drag-begin", 
                           G_CALLBACK (drag_begin_cb), NULL);
-  g_signal_connect (entry, "drag-data-get", 
-                    G_CALLBACK (drag_data_get_cb), NULL);
-  gdk_content_formats_unref (tlist);
+  g_object_unref (content);
 
   /*
    * Search - Uses a helper function


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]