diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index 2b0366c5b7..788e46513d 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -107,168 +107,6 @@ static GtkDragDestInfo * gtk_drag_get_dest_info (GdkDrop *drop, gboolean create); -/******************** - * Destination side * - ********************/ - - -typedef struct { - GdkDrop *drop; - GtkWidget *widget; - const char *mime_type; -} GtkDragGetData; - -static void -gtk_drag_get_data_finish (GtkDragGetData *data, - guchar *bytes, - gsize size) -{ - GtkDragDestSite *site; - GtkSelectionData sdata; - GdkContentFormats *target_list = NULL; - GdkDragAction actions = 0; - GtkDestDefaults flags = 0; - - site = g_object_get_data (G_OBJECT (data->widget), "gtk-drag-dest"); - - sdata.target = data->mime_type; - sdata.type = data->mime_type; - sdata.format = 8; - sdata.length = size; - sdata.data = bytes ? bytes : (guchar *)g_strdup (""); - sdata.display = gtk_widget_get_display (data->widget); - - if (site) - { - target_list = gtk_drop_target_get_formats (site->dest); - actions = gtk_drop_target_get_actions (site->dest); - flags = gtk_drop_target_get_defaults (site->dest); - } - - if (target_list) - { - if (gdk_content_formats_contain_mime_type (target_list, data->mime_type)) - { - if (!(flags & GTK_DEST_DEFAULT_DROP) || size >= 0) - gtk_drop_target_emit_drag_data_received (site->dest, data->drop, &sdata); - } - } - else - { - gtk_drop_target_emit_drag_data_received (site->dest, data->drop, &sdata); - } - - if (flags & GTK_DEST_DEFAULT_DROP) - { - GdkDragAction action = actions & gdk_drop_get_actions (data->drop); - - if (size == 0) - action = 0; - - if (!gdk_drag_action_is_unique (action)) - { - if (action & GDK_ACTION_COPY) - action = GDK_ACTION_COPY; - else if (action & GDK_ACTION_MOVE) - action = GDK_ACTION_MOVE; - } - - gdk_drop_finish (data->drop, action); - } - - g_object_unref (data->widget); - g_object_unref (data->drop); - g_slice_free (GtkDragGetData, data); -} - -static void -gtk_drag_get_data_got_data (GObject *source, - GAsyncResult *result, - gpointer data) -{ - gssize written; - - written = g_output_stream_splice_finish (G_OUTPUT_STREAM (source), result, NULL); - if (written < 0) - { - gtk_drag_get_data_finish (data, NULL, 0); - } - else - { - gtk_drag_get_data_finish (data, - g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (source)), - g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (source))); - } -} - -static void -gtk_drag_get_data_got_stream (GObject *source, - GAsyncResult *result, - gpointer user_data) -{ - GtkDragGetData *data = user_data; - GInputStream *input_stream; - GOutputStream *output_stream; - - input_stream = gdk_drop_read_finish (GDK_DROP (source), result, &data->mime_type, NULL); - if (input_stream == NULL) - { - gtk_drag_get_data_finish (data, NULL, 0); - return; - } - - output_stream = g_memory_output_stream_new_resizable (); - g_output_stream_splice_async (output_stream, - input_stream, - G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET, - G_PRIORITY_DEFAULT, - NULL, - gtk_drag_get_data_got_data, - data); - g_object_unref (output_stream); - g_object_unref (input_stream); - -} - -/** - * gtk_drag_get_data: (method) - * @widget: the widget that will receive the - * #GtkWidget::drag-data-received signal - * @drop: the #GdkDrop - * @target: the target (form of the data) to retrieve - * - * Gets the data associated with a drag. When the data - * is received or the retrieval fails, GTK+ will emit a - * #GtkWidget::drag-data-received signal. Failure of the retrieval - * is indicated by the length field of the @selection_data - * signal parameter being negative. However, when gtk_drag_get_data() - * is called implicitely because the %GTK_DEST_DEFAULT_DROP was set, - * then the widget will not receive notification of failed - * drops. - */ -void -gtk_drag_get_data (GtkWidget *widget, - GdkDrop *drop, - GdkAtom target) -{ - GtkDragGetData *data; - - g_return_if_fail (GTK_IS_WIDGET (widget)); - g_return_if_fail (GDK_IS_DROP (drop)); - - data = g_slice_new0 (GtkDragGetData); - data->widget = g_object_ref (widget); - data->drop = g_object_ref (drop); - data->mime_type = target; - - gdk_drop_read_async (drop, - (const gchar *[2]) { target, NULL }, - G_PRIORITY_DEFAULT, - NULL, - gtk_drag_get_data_got_stream, - data); -} - /* * _gtk_drag_dest_handle_event: * @toplevel: Toplevel widget that received the event @@ -591,33 +429,12 @@ gtk_drag_dest_drop (GtkWidget *widget, { GtkDragDestSite *site; GtkDragDestInfo *info; - GtkDestDefaults flags; - gboolean retval; site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest"); g_return_val_if_fail (site != NULL, FALSE); - flags = gtk_drop_target_get_defaults (site->dest); - info = gtk_drag_get_dest_info (drop, FALSE); g_return_val_if_fail (info != NULL, FALSE); - if (flags & GTK_DEST_DEFAULT_DROP) - { - GdkAtom target; - - target = gtk_drop_target_match (site->dest, drop); - - if (target == NULL) - { - gdk_drop_finish (drop, 0); - return TRUE; - } - else - gtk_drag_get_data (widget, drop, target); - } - - retval = gtk_drop_target_emit_drag_drop (site->dest, drop, x, y); - - return (flags & GTK_DEST_DEFAULT_DROP) ? TRUE : retval; + return gtk_drop_target_emit_drag_drop (site->dest, drop, x, y); } diff --git a/gtk/gtkdnd.h b/gtk/gtkdnd.h index 28f60e3d3b..1fab2f4a92 100644 --- a/gtk/gtkdnd.h +++ b/gtk/gtkdnd.h @@ -39,11 +39,6 @@ G_BEGIN_DECLS /* Destination side */ -GDK_AVAILABLE_IN_ALL -void gtk_drag_get_data (GtkWidget *widget, - GdkDrop *drop, - GdkAtom target); - G_END_DECLS diff --git a/gtk/gtkdragdest.c b/gtk/gtkdragdest.c index 22e7519537..00cb19e6cc 100644 --- a/gtk/gtkdragdest.c +++ b/gtk/gtkdragdest.c @@ -391,19 +391,6 @@ gtk_drop_target_class_init (GtkDropTargetClass *class) NULL, G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_INT); - - signals[DRAG_DATA_RECEIVED] = - g_signal_new (I_("drag-data-received"), - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - 0, - NULL, NULL, - _gtk_marshal_VOID__BOXED, - G_TYPE_NONE, 1, - GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE); - g_signal_set_va_marshaller (signals[DRAG_DATA_RECEIVED], - G_TYPE_FROM_CLASS (class), - _gtk_marshal_VOID__BOXEDv); } /** @@ -756,15 +743,6 @@ gtk_drop_target_emit_drag_drop (GtkDropTarget *dest, return result; } -void -gtk_drop_target_emit_drag_data_received (GtkDropTarget *dest, - GdkDrop *drop, - GtkSelectionData *sdata) -{ - set_drop (dest, drop); - g_signal_emit (dest, signals[DRAG_DATA_RECEIVED], 0, sdata); -} - /** * gtk_drag_highlight: (method) * @widget: a widget to highlight diff --git a/gtk/gtkdragdest.h b/gtk/gtkdragdest.h index 24190d8120..e28d5b3aa9 100644 --- a/gtk/gtkdragdest.h +++ b/gtk/gtkdragdest.h @@ -48,12 +48,7 @@ typedef struct _GtkDropTarget GtkDropTarget; * @GTK_DEST_DEFAULT_HIGHLIGHT: If set for a widget, GTK+ will draw a highlight on * this widget as long as a drag is over this widget and the widget drag format * and action are acceptable. - * @GTK_DEST_DEFAULT_OP: If set for a widget, when a drop occurs, GTK+ will - * will check if the drag matches this widget’s list of possible formats and - * actions. If so, GTK+ will call gtk_drag_get_data() on behalf of the widget. - * Whether or not the drop is successful, GTK+ will call gdk_drag_finish(). If - * the action was a move, then if the drag was successful, then %TRUE will be - * passed for the @delete parameter to gdk_drag_finish(). + * @GTK_DEST_DEFAULT_DROP: Does not do anything now. * @GTK_DEST_DEFAULT_ALL: If set, specifies that all default actions should * be taken. * @@ -65,7 +60,7 @@ typedef enum { GTK_DEST_DEFAULT_MOTION = 1 << 0, GTK_DEST_DEFAULT_HIGHLIGHT = 1 << 1, GTK_DEST_DEFAULT_DROP = 1 << 2, - GTK_DEST_DEFAULT_ALL = 0x07 + GTK_DEST_DEFAULT_ALL = 0x7 } GtkDestDefaults;