static void
drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
+ GdkDrop *drop,
GtkSelectionData *selection_data,
- guint32 time,
gpointer data)
{
if (gtk_selection_data_get_length (selection_data) > 0)
GtkSelectionData *selection_data,
guint time);
static void gtk_calendar_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time);
+ GdkDrop *drop,
+ GtkSelectionData *selection_data);
static gboolean gtk_calendar_drag_motion (GtkWidget *widget,
GdkDragContext *context,
gint x,
* since the data doesn’t result from a drop.
*/
static void
-set_status_pending (GdkDragContext *context,
- GdkDragAction suggested_action)
+set_status_pending (GdkDrop *drop,
+ GdkDragAction suggested_action)
{
- g_object_set_data (G_OBJECT (context),
+ g_object_set_data (G_OBJECT (drop),
I_("gtk-calendar-status-pending"),
GINT_TO_POINTER (suggested_action));
}
static GdkDragAction
-get_status_pending (GdkDragContext *context)
+get_status_pending (GdkDrop *drop)
{
- return GPOINTER_TO_INT (g_object_get_data (G_OBJECT (context),
+ return GPOINTER_TO_INT (g_object_get_data (G_OBJECT (drop),
"gtk-calendar-status-pending"));
}
target = gtk_drag_dest_find_target (widget, context, NULL);
if (target == NULL || gdk_drag_context_get_suggested_action (context) == 0)
gdk_drag_status (context, 0, time);
- else if (get_status_pending (context) == 0)
+ else if (get_status_pending (GDK_DROP (context)) == 0)
{
- set_status_pending (context, gdk_drag_context_get_suggested_action (context));
+ set_status_pending (GDK_DROP (context), gdk_drag_context_get_suggested_action (context));
gtk_drag_get_data (widget, context, target, time);
}
static void
gtk_calendar_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time)
+ GdkDrop *drop,
+ GtkSelectionData *selection_data)
{
GtkCalendar *calendar = GTK_CALENDAR (widget);
GtkCalendarPrivate *priv = calendar->priv;
GDate *date;
GdkDragAction suggested_action;
- suggested_action = get_status_pending (context);
+ suggested_action = get_status_pending (drop);
if (suggested_action)
{
- set_status_pending (context, 0);
+ set_status_pending (drop, 0);
/* We are getting this data due to a request in drag_motion,
* rather than due to a request in drag_drop, so we are just
else
suggested_action = 0;
- gdk_drag_status (context, suggested_action, time);
+ gdk_drop_status (drop, suggested_action);
return;
}
{
g_warning ("Received invalid date data");
g_date_free (date);
- gdk_drag_finish (context, FALSE, time);
+ gdk_drop_finish (drop, 0);
return;
}
year = g_date_get_year (date);
g_date_free (date);
- gdk_drag_finish (context, TRUE, time);
+ gdk_drop_finish (drop, suggested_action);
g_object_freeze_notify (G_OBJECT (calendar));
/* target side drag signals */
static void gtk_color_button_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
+ GdkDrop *drop,
GtkSelectionData *selection_data,
- guint32 time,
GtkColorButton *button);
static void
gtk_color_button_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
+ GdkDrop *drop,
GtkSelectionData *selection_data,
- guint32 time,
GtkColorButton *button)
{
GtkColorButtonPrivate *priv = gtk_color_button_get_instance_private (button);
static void
swatch_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time)
+ GdkDrop *drop,
+ GtkSelectionData *selection_data)
{
gint length;
guint16 *vals;
g_signal_emit_by_name (data->widget,
"drag-data-received",
data->context,
- &sdata,
- data->time);
+ &sdata);
}
}
else
g_signal_emit_by_name (data->widget,
"drag-data-received",
data->context,
- &sdata,
- data->time);
+ &sdata);
}
if (site && site->flags & GTK_DEST_DEFAULT_DROP)
static void gtk_entry_drag_leave (GtkWidget *widget,
GdkDrop *drop);
static void gtk_entry_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time);
+ GdkDrop *drop,
+ GtkSelectionData *selection_data);
static void gtk_entry_drag_data_get (GtkWidget *widget,
GdkDragContext *context,
GtkSelectionData *selection_data,
{
GtkEntry *entry = GTK_ENTRY (widget);
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
- GtkWidget *source_widget;
GdkDragAction suggested_action;
gint new_position, old_position;
gint sel1, sel2;
if (priv->editable &&
gtk_drag_dest_find_target (widget, context, NULL) != NULL)
{
- source_widget = gtk_drag_get_source_widget (context);
- suggested_action = gdk_drag_context_get_suggested_action (context);
+ suggested_action = GDK_ACTION_COPY | GDK_ACTION_MOVE;
if (!gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &sel1, &sel2) ||
new_position < sel1 || new_position > sel2)
{
- if (source_widget == widget)
- {
- /* Default to MOVE, unless the user has
- * pressed ctrl or alt to affect available actions
- */
- if ((gdk_drag_context_get_actions (context) & GDK_ACTION_MOVE) != 0)
- suggested_action = GDK_ACTION_MOVE;
- }
-
priv->dnd_position = new_position;
}
else
{
- if (source_widget == widget)
- suggested_action = 0; /* Can't drop in selection where drag started */
-
priv->dnd_position = -1;
}
}
return TRUE;
}
+static GdkDragAction
+gtk_entry_get_action (GtkEntry *entry,
+ GdkDrop *drop)
+{
+ GtkWidget *widget = GTK_WIDGET (entry);
+ GdkDragContext *drag = gdk_drop_get_drag (drop);
+ GtkWidget *source_widget = gtk_drag_get_source_widget (drag);
+ GdkDragAction actions;
+
+ actions = gdk_drop_get_actions (drop);
+
+ if (source_widget == widget &&
+ actions & GDK_ACTION_MOVE)
+ return GDK_ACTION_MOVE;
+
+ if (actions & GDK_ACTION_COPY)
+ return GDK_ACTION_COPY;
+
+ if (actions & GDK_ACTION_MOVE)
+ return GDK_ACTION_MOVE;
+
+ return 0;
+}
+
static void
gtk_entry_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time)
+ GdkDrop *drop,
+ GtkSelectionData *selection_data)
{
GtkEntry *entry = GTK_ENTRY (widget);
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
GtkEditable *editable = GTK_EDITABLE (widget);
+ GdkDragAction action;
gchar *str;
str = (gchar *) gtk_selection_data_get_text (selection_data);
+ action = gtk_entry_get_action (entry, drop);
- if (str && priv->editable)
+ if (action && str && priv->editable)
{
gint sel1, sel2;
gint length = -1;
end_change (entry);
}
- gdk_drag_finish (context, TRUE, time);
+ gdk_drop_finish (drop, action);
}
else
{
/* Drag and drop didn't happen! */
- gdk_drag_finish (context, FALSE, time);
+ gdk_drop_finish (drop, 0);
}
g_free (str);
/* GtkWidget Functions */
static void gtk_file_chooser_button_destroy (GtkWidget *widget);
static void gtk_file_chooser_button_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *data,
- guint drag_time);
+ GdkDrop *drop,
+ GtkSelectionData *data);
static void gtk_file_chooser_button_show (GtkWidget *widget);
static void gtk_file_chooser_button_hide (GtkWidget *widget);
static void gtk_file_chooser_button_map (GtkWidget *widget);
static void
gtk_file_chooser_button_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *data,
- guint drag_time)
+ GdkDrop *drop,
+ GtkSelectionData *data)
{
GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget);
GtkFileChooserButtonPrivate *priv = gtk_file_chooser_button_get_instance_private (button);
if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->drag_data_received != NULL)
GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->drag_data_received (widget,
- context,
- data,
- drag_time);
+ drop,
+ data);
- if (widget == NULL || context == NULL || data == NULL || gtk_selection_data_get_length (data) < 0)
+ if (widget == NULL || gtk_selection_data_get_length (data) < 0)
return;
if (gtk_selection_data_targets_include_uri (data))
g_signal_emit (button, file_chooser_button_signals[FILE_SET], 0);
}
- gdk_drag_finish (context, TRUE, drag_time);
+ gdk_drop_finish (drop, GDK_ACTION_COPY);
}
static void
static void
file_list_drag_data_received_cb (GtkWidget *widget,
- GdkDragContext *context,
+ GdkDrop *drop,
GtkSelectionData *selection_data,
- guint time_,
gpointer user_data)
{
GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (user_data);
GFile *file;
/* Allow only drags from other widgets; see bug #533891. */
- if (gtk_drag_get_source_widget (context) == widget)
+ if (gdk_drop_get_drag (drop) &&
+ gtk_drag_get_source_widget (gdk_drop_get_drag (drop)) == widget)
{
g_signal_stop_emission_by_name (widget, "drag-data-received");
return;
}
+
/* Parse the text/uri-list string, navigate to the first one */
uris = gtk_selection_data_get_uris (selection_data);
if (uris && uris[0])
gint y,
guint time);
static void gtk_icon_view_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time);
+ GdkDrop *drop,
+ GtkSelectionData *selection_data);
static gboolean gtk_icon_view_maybe_begin_drag (GtkIconView *icon_view,
double x,
double y,
* since the data doesn’t result from a drop.
*/
static void
-set_status_pending (GdkDragContext *context,
+set_status_pending (GdkDrop *drop,
GdkDragAction suggested_action)
{
- g_object_set_data (G_OBJECT (context),
+ g_object_set_data (G_OBJECT (drop),
I_("gtk-icon-view-status-pending"),
GINT_TO_POINTER (suggested_action));
}
static GdkDragAction
-get_status_pending (GdkDragContext *context)
+get_status_pending (GdkDrop *drop)
{
- return GPOINTER_TO_INT (g_object_get_data (G_OBJECT (context),
+ return GPOINTER_TO_INT (g_object_get_data (G_OBJECT (drop),
"gtk-icon-view-status-pending"));
}
}
static void
-set_dest_row (GdkDragContext *context,
+set_dest_row (GdkDrop *drop,
GtkTreeModel *model,
GtkTreePath *dest_row,
gboolean empty_view_drop,
if (!dest_row)
{
- g_object_set_data_full (G_OBJECT (context),
+ g_object_set_data_full (G_OBJECT (drop),
I_("gtk-icon-view-dest-row"),
NULL, NULL);
return;
dr->dest_row = gtk_tree_row_reference_new (model, dest_row);
dr->empty_view_drop = empty_view_drop;
dr->drop_append_mode = drop_append_mode;
- g_object_set_data_full (G_OBJECT (context),
+ g_object_set_data_full (G_OBJECT (drop),
I_("gtk-icon-view-dest-row"),
dr, (GDestroyNotify) dest_row_free);
}
static GtkTreePath*
-get_dest_row (GdkDragContext *context)
+get_dest_row (GdkDrop *drop)
{
DestRow *dr;
- dr = g_object_get_data (G_OBJECT (context), "gtk-icon-view-dest-row");
+ dr = g_object_get_data (G_OBJECT (drop), "gtk-icon-view-dest-row");
if (dr)
{
/* Request data so we can use the source row when
* determining whether to accept the drop
*/
- set_status_pending (context, suggested_action);
+ set_status_pending (GDK_DROP (context), suggested_action);
gtk_drag_get_data (widget, context, target, time);
}
else
{
- set_status_pending (context, 0);
+ set_status_pending (GDK_DROP (context), 0);
gdk_drag_status (context, suggested_action, time);
}
}
/* in case a motion had requested drag data, change things so we
* treat drag data receives as a drop.
*/
- set_status_pending (context, 0);
- set_dest_row (context, model, path,
+ set_status_pending (GDK_DROP (context), 0);
+ set_dest_row (GDK_DROP (context), model, path,
icon_view->priv->empty_view_drop, drop_append_mode);
}
static void
gtk_icon_view_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time)
+ GdkDrop *drop,
+ GtkSelectionData *selection_data)
{
GtkTreePath *path;
gboolean accepted = FALSE;
if (!icon_view->priv->dest_set)
return;
- suggested_action = get_status_pending (context);
+ suggested_action = get_status_pending (drop);
if (suggested_action)
{
suggested_action = 0;
}
- gdk_drag_status (context, suggested_action, time);
+ gdk_drop_status (drop, suggested_action);
if (path)
gtk_tree_path_free (path);
}
- dest_row = get_dest_row (context);
+ dest_row = get_dest_row (drop);
if (dest_row == NULL)
return;
accepted = TRUE;
}
- gdk_drag_finish (context,
- accepted,
- time);
+ gdk_drop_finish (drop, accepted ? suggested_action : 0);
gtk_tree_path_free (dest_row);
/* drop dest_row */
- set_dest_row (context, NULL, NULL, FALSE, FALSE);
+ set_dest_row (drop, NULL, NULL, FALSE, FALSE);
}
/* Drag-and-Drop support */
VOID:INT,INT,BOXED
VOID:INT,INT,INT
VOID:OBJECT,BOOLEAN
+VOID:OBJECT,BOXED
VOID:OBJECT,BOXED,BOXED
VOID:OBJECT,BOXED,UINT
VOID:OBJECT,BOXED,BOOLEAN,BOOLEAN
GtkSelectionData *data,
guint time);
static void gtk_notebook_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *data,
- guint time);
+ GdkDrop *drop,
+ GtkSelectionData *data);
/*** GtkContainer Methods ***/
static void gtk_notebook_set_child_property (GtkContainer *container,
static void
gtk_notebook_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *data,
- guint time)
+ GdkDrop *drop,
+ GtkSelectionData *data)
{
GtkNotebook *notebook;
+ GdkDragContext *drag;
GtkWidget *source_widget;
GtkWidget **child;
notebook = GTK_NOTEBOOK (widget);
- source_widget = gtk_drag_get_source_widget (context);
+ drag = gdk_drop_get_drag (drop);
+ source_widget = gtk_drag_get_source_widget (drag);
if (source_widget &&
+ (gdk_drop_get_actions (drop) & GDK_ACTION_MOVE) &&
gtk_selection_data_get_target (data) == g_intern_static_string ("GTK_NOTEBOOK_TAB"))
{
child = (void*) gtk_selection_data_get_data (data);
do_detach_tab (GTK_NOTEBOOK (source_widget), notebook, *child);
- gdk_drag_finish (context, TRUE, time);
+ gdk_drop_finish (drop, GDK_ACTION_MOVE);
}
else
- gdk_drag_finish (context, FALSE, time);
+ gdk_drop_finish (drop, 0);
}
/* Private GtkContainer Methods :
static gboolean
get_drag_data (GtkWidget *list_box,
GdkDragContext *context,
+ GtkListBoxRow *row,
guint time)
{
GdkAtom target;
if (target == NULL)
return FALSE;
+ if (row)
+ g_object_set_data_full (G_OBJECT (context), "places-sidebar-row", g_object_ref (row), g_object_unref);
gtk_drag_get_data (list_box, context, target, time);
return TRUE;
/* Nothing to do if no drag data */
if (!sidebar->drag_data_received &&
- !get_drag_data (sidebar->list_box, context, time))
+ !get_drag_data (sidebar->list_box, context, row, time))
goto out;
/* Nothing to do if the target is not valid drop destination */
static void
drag_data_received_callback (GtkWidget *list_box,
- GdkDragContext *context,
- int x,
- int y,
+ GdkDrop *drop,
GtkSelectionData *selection_data,
- guint time,
gpointer user_data)
{
gint target_order_index;
GtkPlacesSidebarPlaceType target_place_type;
GtkPlacesSidebarSectionType target_section_type;
gchar *target_uri;
- gboolean success;
GtkPlacesSidebar *sidebar = GTK_PLACES_SIDEBAR (user_data);
GtkListBoxRow *target_row;
+ GdkDragAction real_action;
if (!sidebar->drag_data_received)
{
if (!sidebar->drop_occurred)
return;
- target_row = gtk_list_box_get_row_at_y (GTK_LIST_BOX (sidebar->list_box), y);
-
+ target_row = g_object_get_data (G_OBJECT (drop), "places-sidebar-row");
if (target_row == NULL)
return;
"uri", &target_uri,
NULL);
- success = FALSE;
+ real_action = 0;
- if (!check_valid_drop_target (sidebar, GTK_SIDEBAR_ROW (target_row), GDK_DROP (context)))
+ if (!check_valid_drop_target (sidebar, GTK_SIDEBAR_ROW (target_row), drop))
goto out;
if (sidebar->drag_data_info == DND_GTK_SIDEBAR_ROW)
source_row = (void*) gtk_selection_data_get_data (selection_data);
reorder_bookmarks (sidebar, GTK_SIDEBAR_ROW (*source_row), target_order_index);
- success = TRUE;
+ real_action = GDK_ACTION_MOVE;
}
else
{
/* Dropping URIs! */
- GdkDragAction real_action;
gchar **uris;
GList *source_file_list;
/* file transfer requested */
- real_action = gdk_drag_context_get_selected_action (context);
+ real_action = gdk_drop_get_actions (drop);
- if (real_action == GDK_ACTION_ASK)
- real_action = emit_drag_action_ask (sidebar, gdk_drag_context_get_actions (context));
+ if (!gdk_drag_action_is_unique (real_action))
+ real_action = emit_drag_action_ask (sidebar, real_action);
if (real_action > 0)
{
g_object_unref (dest_file);
}
- success = TRUE;
g_list_free_full (source_file_list, g_object_unref);
g_strfreev (uris);
}
out:
sidebar->drop_occurred = FALSE;
- gdk_drag_finish (context, success, time);
+ g_object_set_data (G_OBJECT (drop), "places-sidebar-row", NULL);
+ gdk_drop_finish (drop, real_action);
stop_drop_feedback (sidebar);
g_free (target_uri);
}
{
gboolean retval = FALSE;
GtkPlacesSidebar *sidebar = GTK_PLACES_SIDEBAR (user_data);
+ GtkListBoxRow *row;
+ row = gtk_list_box_get_row_at_y (GTK_LIST_BOX (sidebar->list_box), y);
sidebar->drop_occurred = TRUE;
- retval = get_drag_data (sidebar->list_box, context, time);
+ retval = get_drag_data (sidebar->list_box, context, row, time);
g_signal_stop_emission_by_name (sidebar->list_box, "drag-drop");
return retval;
gint y,
guint time);
static void gtk_text_view_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time);
+ GdkDrop *drop,
+ GtkSelectionData *selection_data);
static gboolean gtk_text_view_popup_menu (GtkWidget *widget);
GdkRectangle target_rect;
gint bx, by;
GdkAtom target;
- GdkDragAction suggested_action = 0;
+ gboolean can_accept = FALSE;
text_view = GTK_TEXT_VIEW (widget);
priv = text_view->priv;
}
else
{
- if (gtk_text_iter_can_insert (&newplace, priv->editable))
- {
- GtkWidget *source_widget;
-
- suggested_action = gdk_drag_context_get_suggested_action (context);
-
- source_widget = gtk_drag_get_source_widget (context);
-
- if (source_widget == widget)
- {
- /* Default to MOVE, unless the user has
- * pressed ctrl or alt to affect available actions
- */
- if ((gdk_drag_context_get_actions (context) & GDK_ACTION_MOVE) != 0)
- suggested_action = GDK_ACTION_MOVE;
- }
- }
- else
- {
- /* Can't drop here. */
- }
+ can_accept = gtk_text_iter_can_insert (&newplace, priv->editable);
}
- if (suggested_action != 0)
+ if (can_accept)
{
gtk_text_mark_set_visible (priv->dnd_mark, cursor_visible (text_view));
- gdk_drag_status (context, suggested_action, time);
+ gdk_drag_status (context, GDK_ACTION_COPY | GDK_ACTION_MOVE, time);
}
else
{
}
}
+static GdkDragAction
+gtk_text_view_get_action (GtkWidget *textview,
+ GdkDrop *drop)
+{
+ GdkDragContext *drag = gdk_drop_get_drag (drop);
+ GtkWidget *source_widget = gtk_drag_get_source_widget (drag);
+ GdkDragAction actions;
+
+ actions = gdk_drop_get_actions (drop);
+
+ if (source_widget == textview &&
+ actions & GDK_ACTION_MOVE)
+ return GDK_ACTION_MOVE;
+
+ if (actions & GDK_ACTION_COPY)
+ return GDK_ACTION_COPY;
+
+ if (actions & GDK_ACTION_MOVE)
+ return GDK_ACTION_MOVE;
+
+ return 0;
+}
+
static void
gtk_text_view_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time)
+ GdkDrop *drop,
+ GtkSelectionData *selection_data)
{
GtkTextIter drop_point;
GtkTextView *text_view;
GtkTextViewPrivate *priv;
- gboolean success = FALSE;
GtkTextBuffer *buffer = NULL;
+ GdkDragAction action = 0;
text_view = GTK_TEXT_VIEW (widget);
priv = text_view->priv;
if (!gtk_text_iter_can_insert (&drop_point, priv->editable))
goto done;
- success = TRUE;
+ action = gtk_text_view_get_action (widget, drop);
+ if (action == 0)
+ goto done;
gtk_text_buffer_begin_user_action (buffer);
insert_text_data (text_view, &drop_point, selection_data);
done:
- gdk_drag_finish (context, success, time);
+ gdk_drop_finish (drop, action);
- if (success)
+ if (action)
{
gtk_text_buffer_get_iter_at_mark (buffer,
&drop_point,
gint y,
guint time);
static void gtk_tree_view_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time);
+ GdkDrop *drop,
+ GtkSelectionData *selection_data);
/* tree_model signals */
static gboolean gtk_tree_view_real_move_cursor (GtkTreeView *tree_view,
}
static void
-set_dest_row (GdkDragContext *context,
- GtkTreeModel *model,
- GtkTreePath *dest_row,
- gboolean path_down_mode,
- gboolean empty_view_drop,
- gboolean drop_append_mode)
+set_dest_row (GdkDrop *drop,
+ GtkTreeModel *model,
+ GtkTreePath *dest_row,
+ gboolean path_down_mode,
+ gboolean empty_view_drop,
+ gboolean drop_append_mode)
{
DestRow *dr;
if (!dest_row)
{
- g_object_set_data_full (G_OBJECT (context), I_("gtk-tree-view-dest-row"),
+ g_object_set_data_full (G_OBJECT (drop), I_("gtk-tree-view-dest-row"),
NULL, NULL);
return;
}
dr->empty_view_drop = empty_view_drop != FALSE;
dr->drop_append_mode = drop_append_mode != FALSE;
- g_object_set_data_full (G_OBJECT (context), I_("gtk-tree-view-dest-row"),
+ g_object_set_data_full (G_OBJECT (drop), I_("gtk-tree-view-dest-row"),
dr, (GDestroyNotify) dest_row_free);
}
static GtkTreePath*
-get_dest_row (GdkDragContext *context,
- gboolean *path_down_mode)
+get_dest_row (GdkDrop *drop,
+ gboolean *path_down_mode)
{
DestRow *dr =
- g_object_get_data (G_OBJECT (context), "gtk-tree-view-dest-row");
+ g_object_get_data (G_OBJECT (drop), "gtk-tree-view-dest-row");
if (dr)
{
* since the data doesn’t result from a drop.
*/
static void
-set_status_pending (GdkDragContext *context,
- GdkDragAction suggested_action)
+set_status_pending (GdkDrop *drop,
+ GdkDragAction suggested_action)
{
- g_object_set_data (G_OBJECT (context),
+ g_object_set_data (G_OBJECT (drop),
I_("gtk-tree-view-status-pending"),
GINT_TO_POINTER (suggested_action));
}
static GdkDragAction
-get_status_pending (GdkDragContext *context)
+get_status_pending (GdkDrop *drop)
{
- return GPOINTER_TO_INT (g_object_get_data (G_OBJECT (context),
+ return GPOINTER_TO_INT (g_object_get_data (G_OBJECT (drop),
"gtk-tree-view-status-pending"));
}
out:
if (can_drop)
{
- GtkWidget *source_widget;
-
- *suggested_action = gdk_drag_context_get_suggested_action (context);
- source_widget = gtk_drag_get_source_widget (context);
-
- if (source_widget == widget)
- {
- /* Default to MOVE, unless the user has
- * pressed ctrl or shift to affect available actions
- */
- if ((gdk_drag_context_get_actions (context) & GDK_ACTION_MOVE) != 0)
- *suggested_action = GDK_ACTION_MOVE;
- }
+ *suggested_action = GDK_ACTION_COPY | GDK_ACTION_MOVE;
gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
path, pos);
/* Request data so we can use the source row when
* determining whether to accept the drop
*/
- set_status_pending (context, suggested_action);
+ set_status_pending (GDK_DROP (context), suggested_action);
gtk_drag_get_data (widget, context, target, time);
}
else
{
- set_status_pending (context, 0);
+ set_status_pending (GDK_DROP (context), 0);
gdk_drag_status (context, suggested_action, time);
}
}
/* in case a motion had requested drag data, change things so we
* treat drag data receives as a drop.
*/
- set_status_pending (context, 0);
- set_dest_row (context, model, path,
+ set_status_pending (GDK_DROP (context), 0);
+ set_dest_row (GDK_DROP (context), model, path,
path_down_mode, tree_view->priv->empty_view_drop,
drop_append_mode);
}
return FALSE;
}
+static GdkDragAction
+gtk_tree_view_get_action (GtkWidget *treeview,
+ GdkDrop *drop)
+{
+ GdkDragContext *drag = gdk_drop_get_drag (drop);
+ GtkWidget *source_widget = gtk_drag_get_source_widget (drag);
+ GdkDragAction actions;
+
+ actions = gdk_drop_get_actions (drop);
+
+ if (source_widget == treeview &&
+ actions & GDK_ACTION_MOVE)
+ return GDK_ACTION_MOVE;
+
+ if (actions & GDK_ACTION_COPY)
+ return GDK_ACTION_COPY;
+
+ if (actions & GDK_ACTION_MOVE)
+ return GDK_ACTION_MOVE;
+
+ return 0;
+}
+
static void
gtk_tree_view_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time)
+ GdkDrop *drop,
+ GtkSelectionData *selection_data)
{
GtkTreePath *path;
TreeViewDragInfo *di;
- gboolean accepted = FALSE;
GtkTreeModel *model;
GtkTreeView *tree_view;
GtkTreePath *dest_row;
if (di == NULL)
return;
- suggested_action = get_status_pending (context);
+ suggested_action = get_status_pending (drop);
if (suggested_action)
{
}
}
- gdk_drag_status (context, suggested_action, time);
+ gdk_drop_status (drop, suggested_action);
if (path)
gtk_tree_path_free (path);
return;
}
- dest_row = get_dest_row (context, &path_down_mode);
+ dest_row = get_dest_row (drop, &path_down_mode);
if (dest_row == NULL)
return;
if (gtk_selection_data_get_length (selection_data) >= 0)
{
- if (gtk_tree_drag_dest_drag_data_received (GTK_TREE_DRAG_DEST (model),
- dest_row,
- selection_data))
- accepted = TRUE;
+ suggested_action = gtk_tree_view_get_action (widget, drop);
+
+ if (suggested_action &&
+ !gtk_tree_drag_dest_drag_data_received (GTK_TREE_DRAG_DEST (model),
+ dest_row,
+ selection_data))
+ suggested_action = 0;
}
- gdk_drag_finish (context, accepted, time);
+ gdk_drop_finish (drop, suggested_action);
if (gtk_tree_path_get_depth (dest_row) == 1 &&
gtk_tree_path_get_indices (dest_row)[0] == 0 &&
gtk_tree_path_free (dest_row);
/* drop dest_row */
- set_dest_row (context, NULL, NULL, FALSE, FALSE, FALSE);
+ set_dest_row (drop, NULL, NULL, FALSE, FALSE, FALSE);
}
-
/* GtkContainer Methods
*/
/**
* GtkWidget::drag-data-received:
* @widget: the object which received the signal
- * @context: the drag context
+ * @drop: the #GdkDrop
* @x: where the drop happened
* @y: where the drop happened
* @data: the received data
- * @time: the timestamp at which the data was received
*
* The ::drag-data-received signal is emitted on the drop site when the
* dragged data has been received. If the data was received in order to
* |[<!-- language="C" -->
* void
* drag_data_received (GtkWidget *widget,
- * GdkDragContext *context,
- * gint x,
- * gint y,
- * GtkSelectionData *data,
- * guint info,
- * guint time)
+ * GdkDrop *drop,
+ * GtkSelectionData *data)
* {
* if ((data->length >= 0) && (data->format == 8))
* {
*
* // handle data here
*
- * action = gdk_drag_context_get_selected_action (context);
- * if (action == GDK_ACTION_ASK)
+ * action = gdk_drop_get_actions (drop);
+ * if (!gdk_drag_action_is_unique (action))
* {
* GtkWidget *dialog;
* gint response;
* action = GDK_ACTION_COPY;
* }
*
- * gdk_drag_finish (context, TRUE, action == GDK_ACTION_MOVE, time);
+ * gdk_drop_finish (context, action);
* }
* else
- * gdk_drag_finish (context, FALSE, FALSE, time);
+ * gdk_drop_finish (context, 0);
* }
* ]|
*/
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkWidgetClass, drag_data_received),
NULL, NULL,
- _gtk_marshal_VOID__OBJECT_BOXED_UINT,
- G_TYPE_NONE, 3,
- GDK_TYPE_DRAG_CONTEXT,
- GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
- G_TYPE_UINT);
+ _gtk_marshal_VOID__OBJECT_BOXED,
+ G_TYPE_NONE, 2,
+ GDK_TYPE_DROP,
+ GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE);
/**
* GtkWidget::query-tooltip:
gint y,
guint time_);
void (* drag_data_received) (GtkWidget *widget,
- GdkDragContext *context,
- GtkSelectionData *selection_data,
- guint time_);
+ GdkDrop *drop,
+ GtkSelectionData *selection_data);
gboolean (* drag_failed) (GtkWidget *widget,
GdkDragContext *context,
GtkDragResult result);
static void
image_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
+ GdkDrop *drop,
GtkSelectionData *selection_data,
- guint32 time,
gpointer data)
{
gchar *text;
static void
drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
+ GdkDrop *drop,
GtkSelectionData *selection_data,
- guint32 time,
gpointer data)
{
GtkWidget *target;
static void
on_button_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
+ GdkDrop *drop,
GtkSelectionData *data,
- guint time,
gpointer user_data)
{
GtkWidget **child;
static void
drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
+ GdkDrop *drop,
GtkSelectionData *selda,
- guint time,
gpointer dada)
{
gchar *text;