static void
drag_begin (GtkDragSource *source,
+ GdkDrag *drag,
GtkWidget *widget)
{
GdkPaintable *paintable;
static void
drag_begin (GtkDragSource *source,
+ GdkDrag *drag,
GtkWidget *widget)
{
GdkPaintable *paintable;
static void
gtk_color_button_drag_begin (GtkDragSource *source,
+ GdkDrag *drag,
GtkColorButton *button)
{
GtkColorButtonPrivate *priv = gtk_color_button_get_instance_private (button);
static void
gtk_color_swatch_drag_begin (GtkDragSource *source,
+ GdkDrag *drag,
GtkColorSwatch *swatch)
{
GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch);
DRAG_BEGIN,
DRAG_END,
DRAG_FAILED,
- DRAG_DATA_DELETE,
NUM_SIGNALS
};
/**
* GtkDragSource::drag-begin:
* @source: the #GtkDragSource
+ * @drag: the #GtkDrag object
*
* The ::drag-begin signal is emitted on the drag source when a drag
* is started. It can be used to e.g. set a custom drag icon with
- * gtk_drag_source_set_icon(). But all of the setup can also be
- * done before calling gtk_drag_source_drag_begin(), so this is not
- * really necessary.
+ * gtk_drag_source_set_icon().
*/
signals[DRAG_BEGIN] =
g_signal_new (I_("drag-begin"),
0,
NULL, NULL,
NULL,
- G_TYPE_NONE, 0);
+ G_TYPE_NONE, 1,
+ GDK_TYPE_DRAG);
/**
* GtkDragSource::drag-end:
* @source: the #GtkDragSource
+ * @drag: the #GtkDrag object
+ * @delete_data: %TRUE if the drag was performing %GDK_ACTION_MOVE,
+ * and the data should be deleted
*
* The ::drag-end signal is emitted on the drag source when a drag is
* finished. A typical reason to connect to this signal is to undo
0,
NULL, NULL,
NULL,
- G_TYPE_NONE, 0);
+ G_TYPE_NONE, 2,
+ GDK_TYPE_DRAG,
+ G_TYPE_BOOLEAN);
/**
* GtkDragSource::drag-failed:
* @source: the #GtkDragSource
+ * @drag: the #GtkDrag object
* @reason: information on why the drag failed
*
* The ::drag-failed signal is emitted on the drag source when a drag has
G_SIGNAL_RUN_LAST,
0,
_gtk_boolean_handled_accumulator, NULL,
- _gtk_marshal_BOOLEAN__ENUM,
- G_TYPE_BOOLEAN, 1,
+ _gtk_marshal_BOOLEAN__OBJECT_ENUM,
+ G_TYPE_BOOLEAN, 2,
+ GDK_TYPE_DRAG,
GDK_TYPE_DRAG_CANCEL_REASON);
-
- /**
- * GtkDragSource::drag-data-delete:
- * @source: the #GtkDragSource
- *
- * The ::drag-data-delete signal is emitted on the drag source when a drag
- * with the action %GDK_ACTION_MOVE is successfully completed. The signal
- * handler is responsible for deleting the data that has been dropped. What
- * "delete" means depends on the context of the drag operation.
- */
- signals[DRAG_DATA_DELETE] =
- g_signal_new (I_("drag-data-delete"),
- G_TYPE_FROM_CLASS (class),
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL,
- NULL,
- G_TYPE_NONE, 0);
}
static void gtk_drag_source_dnd_finished_cb (GdkDrag *drag,
drag_end (GtkDragSource *source,
gboolean success)
{
+ gboolean delete_data;
+
g_signal_handlers_disconnect_by_func (source->drag, gtk_drag_source_drop_performed_cb, source);
g_signal_handlers_disconnect_by_func (source->drag, gtk_drag_source_dnd_finished_cb, source);
g_signal_handlers_disconnect_by_func (source->drag, gtk_drag_source_cancel_cb, source);
- g_signal_emit (source, signals[DRAG_END], 0);
+ delete_data = success && gdk_drag_get_selected_action (source->drag) == GDK_ACTION_MOVE;
+
+ g_signal_emit (source, signals[DRAG_END], 0, source->drag, delete_data);
gdk_drag_drop_done (source->drag, success);
gtk_drag_source_dnd_finished_cb (GdkDrag *drag,
GtkDragSource *source)
{
- if (gdk_drag_get_selected_action (drag) == GDK_ACTION_MOVE)
- g_signal_emit (source, signals[DRAG_DATA_DELETE], 0);
drag_end (source, TRUE);
}
{
gboolean success = FALSE;
- g_signal_emit (source, signals[DRAG_FAILED], 0, reason, &success);
+ g_signal_emit (source, signals[DRAG_FAILED], 0, source->drag, reason, &success);
drag_end (source, FALSE);
}
/* We hold a ref until ::drag-end is emitted */
g_object_ref (source);
- g_signal_emit (source, signals[DRAG_BEGIN], 0);
+ g_signal_emit (source, signals[DRAG_BEGIN], 0, source->drag);
if (!source->paintable)
{
{
gboolean success = FALSE;
- g_signal_emit (source, signals[DRAG_FAILED], 0, GDK_DRAG_CANCEL_ERROR, &success);
+ g_signal_emit (source, signals[DRAG_FAILED], 0, source->drag, GDK_DRAG_CANCEL_ERROR, &success);
gdk_drag_drop_done (source->drag, success);
}
static void update_pixbuf_cell (GtkIconView *icon_view);
/* Source side drag signals */
-static void gtk_icon_view_drag_begin (GtkDragSource *source,
- GtkWidget *widget);
-static GBytes * gtk_icon_view_drag_data_get (const char *mime_type,
- gpointer data);
-static void gtk_icon_view_drag_data_delete (GtkDragSource *source,
- GtkWidget *widget);
+static void gtk_icon_view_drag_begin (GtkDragSource *source,
+ GdkDrag *drag,
+ GtkWidget *widget);
+static void gtk_icon_view_drag_end (GtkDragSource *source,
+ GdkDrag *drag,
+ gboolean delete_data,
+ GtkWidget *widget);
+static GBytes * gtk_icon_view_drag_data_get (const char *mime_type,
+ gpointer data);
/* Target side drag signals */
static void gtk_icon_view_drag_leave (GtkDropTarget *dest,
/* Source side drag signals */
static void
gtk_icon_view_drag_begin (GtkDragSource *source,
- GtkWidget *widget)
+ GdkDrag *drag,
+ GtkWidget *widget)
{
GtkIconView *icon_view;
GtkIconViewItem *item;
}
static void
-gtk_icon_view_drag_data_delete (GtkDragSource *source,
- GtkWidget *widget)
+gtk_icon_view_drag_end (GtkDragSource *source,
+ GdkDrag *drag,
+ gboolean delete_data,
+ GtkWidget *widget)
{
GtkTreeModel *model;
GtkIconView *icon_view;
GtkTreePath *source_row;
+ if (!delete_data)
+ return;
+
icon_view = GTK_ICON_VIEW (widget);
model = gtk_icon_view_get_model (icon_view);
g_signal_connect (icon_view->priv->source, "drag-begin",
G_CALLBACK (gtk_icon_view_drag_begin), icon_view);
- g_signal_connect (icon_view->priv->source, "drag-data-delete",
- G_CALLBACK (gtk_icon_view_drag_data_delete), icon_view);
+ g_signal_connect (icon_view->priv->source, "drag-end",
+ G_CALLBACK (gtk_icon_view_drag_end), icon_view);
icon_view->priv->start_button_mask = start_button_mask;
icon_view->priv->source_actions = actions;
/*** Drag and drop Methods ***/
static void gtk_notebook_drag_begin (GtkDragSource *source,
+ GdkDrag *drag,
GtkWidget *widget);
static void gtk_notebook_drag_end (GtkDragSource *source,
+ GdkDrag *drag,
+ gboolean delete_data,
GtkWidget *widget);
static gboolean gtk_notebook_drag_failed (GtkDragSource *source,
+ GdkDrag *drag,
GdkDragCancelReason reason,
GtkWidget *widget);
static gboolean gtk_notebook_drag_motion (GtkDropTarget *dest,
static void
gtk_notebook_drag_begin (GtkDragSource *source,
+ GdkDrag *drag,
GtkWidget *widget)
{
GtkNotebook *notebook = GTK_NOTEBOOK (widget);
static void
gtk_notebook_drag_end (GtkDragSource *source,
+ GdkDrag *drag,
+ gboolean delete_data,
GtkWidget *widget)
{
GtkNotebook *notebook = GTK_NOTEBOOK (widget);
}
static gboolean
-gtk_notebook_drag_failed (GtkDragSource *source,
- GdkDragCancelReason reason,
- GtkWidget *widget)
+gtk_notebook_drag_failed (GtkDragSource *source,
+ GdkDrag *drag,
+ GdkDragCancelReason reason,
+ GtkWidget *widget)
{
GtkNotebook *notebook = GTK_NOTEBOOK (widget);
GtkNotebookPrivate *priv = notebook->priv;
static void
drag_begin_callback (GtkDragSource *source,
- gpointer user_data)
+ GdkDrag *drag,
+ gpointer user_data)
{
GtkPlacesSidebar *sidebar = GTK_PLACES_SIDEBAR (user_data);
GtkAllocation allocation;
static void
drag_end_callback (GtkDragSource *source,
+ GdkDrag *drag,
+ gboolean delete_data,
gpointer user_data)
{
stop_drop_feedback (GTK_PLACES_SIDEBAR (user_data));
}
static void
-drag_end (GtkText *self)
+drag_end (GtkDragSource *source,
+ GdkDrag *drag,
+ gboolean delete_data,
+ GtkText *self)
{
g_object_set_data (G_OBJECT (self), "drag-source", NULL);
+ if (delete_data)
+ gtk_text_delete_selection (self);
}
static void
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_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,
/* Source side drag signals */
static void gtk_tree_view_drag_begin (GtkDragSource *source,
+ GdkDrag *drag,
GtkWidget *widget);
static void gtk_tree_view_drag_end (GtkDragSource *source,
+ GdkDrag *drag,
+ gboolean delete_data,
GtkWidget *widget);
static GBytes *gtk_tree_view_drag_data_get (const char *mimetype,
gpointer data);
-static void gtk_tree_view_drag_data_delete (GtkDragSource *source,
- GtkWidget *widget);
/* Target side drag signals */
static void gtk_tree_view_drag_leave (GtkDropTarget *dest,
static void
gtk_tree_view_drag_begin (GtkDragSource *source,
+ GdkDrag *drag,
GtkWidget *widget)
{
GtkTreeView *tree_view;
}
static void
-gtk_tree_view_drag_end (GtkDragSource *sourc,
+gtk_tree_view_drag_end (GtkDragSource *source,
+ GdkDrag *drag,
+ gboolean delete_data,
GtkWidget *widget)
{
GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
+ TreeViewDragInfo *di;
+ GtkTreeModel *model;
+ GtkTreePath *source_row;
tree_view->event_last_x = -10000;
tree_view->event_last_y = -10000;
+
+ if (!delete_data)
+ return;
+
+ tree_view = GTK_TREE_VIEW (widget);
+ model = gtk_tree_view_get_model (tree_view);
+
+ if (!check_model_dnd (model, GTK_TYPE_TREE_DRAG_SOURCE, "drag_data_delete"))
+ return;
+
+ di = get_info (tree_view);
+
+ if (di == NULL)
+ return;
+
+ source_row = get_source_row (source);
+
+ if (source_row == NULL)
+ return;
+
+ gtk_tree_drag_source_drag_data_delete (GTK_TREE_DRAG_SOURCE (model), source_row);
+
+ gtk_tree_path_free (source_row);
+
+ set_source_row (source, NULL, NULL);
}
/* Default signal implementations for the drag signals */
gtk_selection_data_get_length (&sdata));
}
-
-static void
-gtk_tree_view_drag_data_delete (GtkDragSource *source,
- GtkWidget *widget)
-{
- TreeViewDragInfo *di;
- GtkTreeModel *model;
- GtkTreeView *tree_view;
- GtkTreePath *source_row;
-
- tree_view = GTK_TREE_VIEW (widget);
- model = gtk_tree_view_get_model (tree_view);
-
- if (!check_model_dnd (model, GTK_TYPE_TREE_DRAG_SOURCE, "drag_data_delete"))
- return;
-
- di = get_info (tree_view);
-
- if (di == NULL)
- return;
-
- source_row = get_source_row (source);
-
- if (source_row == NULL)
- return;
-
- gtk_tree_drag_source_drag_data_delete (GTK_TREE_DRAG_SOURCE (model), source_row);
-
- gtk_tree_path_free (source_row);
-
- set_source_row (source, NULL, NULL);
-}
-
static void
gtk_tree_view_drag_leave (GtkDropTarget *dest,
GtkTreeView *tree_view)
g_object_unref (content);
g_signal_connect (di->source, "drag-begin", G_CALLBACK (gtk_tree_view_drag_begin), tree_view);
g_signal_connect (di->source, "drag-end", G_CALLBACK (gtk_tree_view_drag_end), tree_view);
- g_signal_connect (di->source, "drag-data-delete", G_CALLBACK (gtk_tree_view_drag_data_delete), tree_view);
di->start_button_mask = start_button_mask;
di->source_set = TRUE;
}
static gboolean
-drag_failed (GtkDragSource *source, GdkDragCancelReason reason)
+drag_failed (GtkDragSource *source,
+ GdkDrag *drag,
+ GdkDragCancelReason reason)
{
g_print ("drag failed: %d\n", reason);
return FALSE;
static void
spinner_drag_begin (GtkDragSource *source,
- GtkWidget *widget)
+ GdkDrag *drag,
+ GtkWidget *widget)
{
GdkPaintable *paintable;
static void
drag_begin (GtkDragSource *source,
+ GdkDrag *drag,
GtkWidget *widget)
{
GtkWidget *row;