[gtk/dnd-gestures-2: 54/150] iconview: Port to GtkDropTarget
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/dnd-gestures-2: 54/150] iconview: Port to GtkDropTarget
- Date: Tue, 7 Jan 2020 06:56:28 +0000 (UTC)
commit f1d7cff16c61a985bea43314cced380ed17e2c46
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Jan 2 01:00:44 2020 -0500
iconview: Port to GtkDropTarget
A small api change here is that
gtk_icon_view_enable_model_drag_dest now returns
a GtkDropTarget that can be used to connect signals.
gtk/gtkiconview.c | 109 ++++++++++++++++++++++++-----------------------
gtk/gtkiconview.h | 3 +-
gtk/gtkiconviewprivate.h | 1 +
3 files changed, 58 insertions(+), 55 deletions(-)
---
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index f3a3886991..fbc5e0e6ce 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -49,6 +49,7 @@
#include "gtkwindow.h"
#include "gtkeventcontrollerkey.h"
#include "gtkdragsource.h"
+#include "gtkdragdest.h"
#include "gtkselectionprivate.h"
#include "a11y/gtkiconviewaccessibleprivate.h"
@@ -289,19 +290,19 @@ static void gtk_icon_view_drag_data_delete (GtkDragSource *source,
GtkWidget *widget);
/* Target side drag signals */
-static void gtk_icon_view_drag_leave (GtkWidget *widget,
- GdkDrop *drop);
-static gboolean gtk_icon_view_drag_motion (GtkWidget *widget,
- GdkDrop *drop,
- gint x,
- gint y);
-static gboolean gtk_icon_view_drag_drop (GtkWidget *widget,
- GdkDrop *drop,
- gint x,
- gint y);
-static void gtk_icon_view_drag_data_received (GtkWidget *widget,
- GdkDrop *drop,
- GtkSelectionData *selection_data);
+static void gtk_icon_view_drag_leave (GtkDropTarget *dest,
+ GtkIconView *icon_view);
+static gboolean gtk_icon_view_drag_motion (GtkDropTarget *dest,
+ int x,
+ int y,
+ GtkIconView *icon_view);
+static gboolean gtk_icon_view_drag_drop (GtkDropTarget *dest,
+ int x,
+ int y,
+ GtkIconView *icon_view);
+static void gtk_icon_view_drag_data_received (GtkDropTarget *dest,
+ GtkSelectionData *selection_data,
+ GtkIconView *icon_view);
static gboolean gtk_icon_view_maybe_begin_drag (GtkIconView *icon_view,
double x,
double y,
@@ -359,10 +360,6 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
widget_class->measure = gtk_icon_view_measure;
widget_class->size_allocate = gtk_icon_view_size_allocate;
widget_class->snapshot = gtk_icon_view_snapshot;
- widget_class->drag_leave = gtk_icon_view_drag_leave;
- widget_class->drag_motion = gtk_icon_view_drag_motion;
- widget_class->drag_drop = gtk_icon_view_drag_drop;
- widget_class->drag_data_received = gtk_icon_view_drag_data_received;
container_class->remove = gtk_icon_view_remove;
container_class->forall = gtk_icon_view_forall;
@@ -1028,6 +1025,9 @@ gtk_icon_view_dispose (GObject *object)
g_clear_object (&priv->key_controller);
+ g_clear_object (&priv->source);
+ g_clear_pointer (&priv->dest, gtk_drop_target_detach);
+
G_OBJECT_CLASS (gtk_icon_view_parent_class)->dispose (object);
}
@@ -5881,7 +5881,7 @@ drag_scroll_timeout (gpointer data)
static gboolean
set_destination (GtkIconView *icon_view,
- GdkDrop *drop,
+ GtkDropTarget *dest,
gint x,
gint y,
GdkDragAction *suggested_action,
@@ -5914,8 +5914,7 @@ set_destination (GtkIconView *icon_view,
return FALSE; /* no longer a drop site */
}
- *target = gtk_drag_dest_find_target (widget, drop,
- gtk_drag_dest_get_target_list (widget));
+ *target = gtk_drop_target_find_mimetype (dest);
if (*target == NULL)
return FALSE;
@@ -6195,13 +6194,9 @@ gtk_icon_view_drag_data_delete (GtkDragSource *source,
/* Target side drag signals */
static void
-gtk_icon_view_drag_leave (GtkWidget *widget,
- GdkDrop *drop)
+gtk_icon_view_drag_leave (GtkDropTarget *dest,
+ GtkIconView *icon_view)
{
- GtkIconView *icon_view;
-
- icon_view = GTK_ICON_VIEW (widget);
-
/* unset any highlight row */
gtk_icon_view_set_drag_dest_item (icon_view,
NULL,
@@ -6211,21 +6206,19 @@ gtk_icon_view_drag_leave (GtkWidget *widget,
}
static gboolean
-gtk_icon_view_drag_motion (GtkWidget *widget,
- GdkDrop *drop,
- gint x,
- gint y)
+gtk_icon_view_drag_motion (GtkDropTarget *dest,
+ int x,
+ int y,
+ GtkIconView *icon_view)
{
+ GdkDrop *drop = gtk_drop_target_get_drop (dest);
GtkTreePath *path = NULL;
GtkIconViewDropPosition pos;
- GtkIconView *icon_view;
GdkDragAction suggested_action = 0;
GdkAtom target;
gboolean empty;
- icon_view = GTK_ICON_VIEW (widget);
-
- if (!set_destination (icon_view, drop, x, y, &suggested_action, &target))
+ if (!set_destination (icon_view, dest, x, y, &suggested_action, &target))
return FALSE;
icon_view->priv->event_last_x = x;
@@ -6255,7 +6248,7 @@ gtk_icon_view_drag_motion (GtkWidget *widget,
* determining whether to accept the drop
*/
set_status_pending (drop, suggested_action);
- gtk_drag_get_data (widget, drop, target);
+ gtk_drag_get_data (GTK_WIDGET (icon_view), drop, target);
}
else
{
@@ -6271,22 +6264,21 @@ gtk_icon_view_drag_motion (GtkWidget *widget,
}
static gboolean
-gtk_icon_view_drag_drop (GtkWidget *widget,
- GdkDrop *drop,
- gint x,
- gint y)
+gtk_icon_view_drag_drop (GtkDropTarget *dest,
+ int x,
+ int y,
+ GtkIconView *icon_view)
{
- GtkIconView *icon_view;
+ GdkDrop *drop = gtk_drop_target_get_drop (dest);
GtkTreePath *path;
GdkDragAction suggested_action = 0;
GdkAtom target = NULL;
GtkTreeModel *model;
gboolean drop_append_mode;
- icon_view = GTK_ICON_VIEW (widget);
model = gtk_icon_view_get_model (icon_view);
- remove_scroll_timeout (GTK_ICON_VIEW (widget));
+ remove_scroll_timeout (icon_view);
if (!icon_view->priv->dest_set)
return FALSE;
@@ -6294,7 +6286,7 @@ gtk_icon_view_drag_drop (GtkWidget *widget,
if (!check_model_dnd (model, GTK_TYPE_TREE_DRAG_DEST, "drag-drop"))
return FALSE;
- if (!set_destination (icon_view, drop, x, y, &suggested_action, &target))
+ if (!set_destination (icon_view, dest, x, y, &suggested_action, &target))
return FALSE;
path = get_logical_destination (icon_view, &drop_append_mode);
@@ -6317,7 +6309,7 @@ gtk_icon_view_drag_drop (GtkWidget *widget,
if (target != NULL)
{
- gtk_drag_get_data (widget, drop, target);
+ gtk_drag_get_data (GTK_WIDGET (icon_view), drop, target);
return TRUE;
}
else
@@ -6352,18 +6344,17 @@ gtk_icon_view_get_action (GtkWidget *widget,
}
static void
-gtk_icon_view_drag_data_received (GtkWidget *widget,
- GdkDrop *drop,
- GtkSelectionData *selection_data)
+gtk_icon_view_drag_data_received (GtkDropTarget *dest,
+ GtkSelectionData *selection_data,
+ GtkIconView *icon_view)
{
+ GdkDrop *drop = gtk_drop_target_get_drop (dest);
GtkTreePath *path;
GtkTreeModel *model;
- GtkIconView *icon_view;
GtkTreePath *dest_row;
GdkDragAction suggested_action;
gboolean drop_append_mode;
- icon_view = GTK_ICON_VIEW (widget);
model = gtk_icon_view_get_model (icon_view);
if (!check_model_dnd (model, GTK_TYPE_TREE_DRAG_DEST, "drag-data-received"))
@@ -6415,7 +6406,7 @@ gtk_icon_view_drag_data_received (GtkWidget *widget,
if (gtk_selection_data_get_length (selection_data) >= 0)
{
- suggested_action = gtk_icon_view_get_action (widget, drop);
+ suggested_action = gtk_icon_view_get_action (GTK_WIDGET (icon_view), drop);
if (suggested_action &&
!gtk_tree_drag_dest_drag_data_received (GTK_TREE_DRAG_DEST (model),
@@ -6485,21 +6476,30 @@ gtk_icon_view_enable_model_drag_source (GtkIconView *icon_view,
*
* Turns @icon_view into a drop destination for automatic DND. Calling this
* method sets #GtkIconView:reorderable to %FALSE.
+ *
+ * Returns: (transfer none): the drop target that was attached
**/
-void
+GtkDropTarget *
gtk_icon_view_enable_model_drag_dest (GtkIconView *icon_view,
GdkContentFormats *formats,
GdkDragAction actions)
{
- g_return_if_fail (GTK_IS_ICON_VIEW (icon_view));
+ g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), NULL);
- gtk_drag_dest_set (GTK_WIDGET (icon_view), 0, formats, actions);
+ icon_view->priv->dest = gtk_drop_target_new (0, formats, actions);
+ g_signal_connect (icon_view->priv->dest, "drag-leave", G_CALLBACK (gtk_icon_view_drag_leave), icon_view);
+ g_signal_connect (icon_view->priv->dest, "drag-motion", G_CALLBACK (gtk_icon_view_drag_motion), icon_view);
+ g_signal_connect (icon_view->priv->dest, "drag-drop", G_CALLBACK (gtk_icon_view_drag_drop), icon_view);
+ g_signal_connect (icon_view->priv->dest, "drag-data-received", G_CALLBACK
(gtk_icon_view_drag_data_received), icon_view);
+ gtk_drop_target_attach (icon_view->priv->dest, GTK_WIDGET (icon_view));
icon_view->priv->dest_actions = actions;
icon_view->priv->dest_set = TRUE;
unset_reorderable (icon_view);
+
+ return icon_view->priv->dest;
}
/**
@@ -6537,7 +6537,8 @@ gtk_icon_view_unset_model_drag_dest (GtkIconView *icon_view)
if (icon_view->priv->dest_set)
{
- gtk_drag_dest_unset (GTK_WIDGET (icon_view));
+ gtk_drop_target_detach (icon_view->priv->dest);
+ icon_view->priv->dest = NULL;
icon_view->priv->dest_set = FALSE;
}
diff --git a/gtk/gtkiconview.h b/gtk/gtkiconview.h
index 41fd376926..3635ca88ff 100644
--- a/gtk/gtkiconview.h
+++ b/gtk/gtkiconview.h
@@ -29,6 +29,7 @@
#include <gtk/gtkselection.h>
#include <gtk/gtktooltip.h>
#include <gtk/gtkdragsource.h>
+#include <gtk/gtkdragdest.h>
G_BEGIN_DECLS
@@ -219,7 +220,7 @@ GtkDragSource * gtk_icon_view_enable_model_drag_source (GtkIconView
GdkContentFormats *formats,
GdkDragAction actions);
GDK_AVAILABLE_IN_ALL
-void gtk_icon_view_enable_model_drag_dest (GtkIconView *icon_view,
+GtkDropTarget * gtk_icon_view_enable_model_drag_dest (GtkIconView *icon_view,
GdkContentFormats *formats,
GdkDragAction actions);
GDK_AVAILABLE_IN_ALL
diff --git a/gtk/gtkiconviewprivate.h b/gtk/gtkiconviewprivate.h
index 4ac5a9892c..af3fa5bc93 100644
--- a/gtk/gtkiconviewprivate.h
+++ b/gtk/gtkiconviewprivate.h
@@ -134,6 +134,7 @@ struct _GtkIconViewPrivate
gint press_start_y;
GtkDragSource *source;
+ GtkDropTarget *dest;
GdkDragAction source_actions;
GdkDragAction dest_actions;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]