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
{
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);
}
* @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.
*
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;