Remove arguments from the constructor.
For actions, we now default to COPY, which is the most common one
that we should enable by default (MOVE requires handling deletion
on the the source side, and ASK only makes sense if we have
multiple actions).
For the content provider, we add a new ::prepare signal where
it should be provided just-in-time.
g_value_set_object (value, paintable);
}
+static void
+prepare_drag (GtkDragSource *source,
+ double x,
+ double y,
+ GtkWidget *image)
+{
+ GdkContentProvider *content;
+
+ content = gdk_content_provider_new_with_callback (GDK_TYPE_TEXTURE, get_texture, image);
+ gtk_drag_source_set_content (source, content);
+ g_object_unref (content);
+}
+
static void
got_texture (GObject *source,
GAsyncResult *result,
{ "paste", paste_image, NULL, NULL, NULL },
};
GActionGroup *actions;
- GdkContentProvider *content = NULL;
GtkDragSource *source;
GtkDropTarget *dest;
GdkContentFormats *formats;
gtk_container_add (GTK_CONTAINER (hbox), image);
/* make image a drag source */
- content = gdk_content_provider_new_with_callback (GDK_TYPE_TEXTURE, get_texture, image);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY);
- g_object_unref (content);
+ source = gtk_drag_source_new ();
gtk_drag_source_attach (source, image, GDK_BUTTON1_MASK);
+ g_signal_connect (source, "prepare", G_CALLBACK (prepare_drag), NULL);
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), image);
/* accept drops on image */
gtk_container_add (GTK_CONTAINER (hbox), image);
/* make image a drag source */
- content = gdk_content_provider_new_with_callback (GDK_TYPE_TEXTURE, get_texture, image);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY);
- g_object_unref (content);
+ source = gtk_drag_source_new ();
+ g_signal_connect (source, "prepare", G_CALLBACK (prepare_drag), NULL);
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), image);
gtk_drag_source_attach (source, image, GDK_BUTTON1_MASK);
GdkContentProvider *content;
GtkDragSource *source;
+ source = gtk_drag_source_new ();
content = gdk_content_provider_new_with_callback (GDK_TYPE_TEXTURE, get_texture, image);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY);
+ gtk_drag_source_set_content (source, content);
g_object_unref (content);
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), image);
gtk_drag_source_attach (source, image, GDK_BUTTON1_MASK);
GdkContentProvider *content;
GtkDragSource *source;
+ source = gtk_drag_source_new ();
content = gdk_content_provider_new_with_callback (G_TYPE_FILE, get_file, image);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY);
+ gtk_drag_source_set_content (source, content);
g_object_unref (content);
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), image);
gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y);
+ source = gtk_drag_source_new ();
content = get_calendar_content (calendar);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY);
+ gtk_drag_source_set_content (source, content);
g_object_unref (content);
device = gtk_gesture_get_device (GTK_GESTURE (gesture));
gtk_drag_source_drag_begin (source, widget, device, start_x, start_y);
gtk_widget_add_controller (GTK_WIDGET (button), GTK_EVENT_CONTROLLER (dest));
gdk_content_formats_unref (targets);
+ source = gtk_drag_source_new ();
content = gdk_content_provider_new_with_callback (GDK_TYPE_RGBA, get_rgba_value, button);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY);
+ gtk_drag_source_set_content (source, content);
g_object_unref (content);
g_signal_connect (source, "drag-begin", G_CALLBACK (gtk_color_button_drag_begin), button);
GdkContentProvider *content;
GtkDragSource *source;
+ source = gtk_drag_source_new ();
content = gdk_content_provider_new_with_callback (GDK_TYPE_RGBA, get_rgba_value, swatch);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY);
+ gtk_drag_source_set_content (source, content);
g_object_unref (content);
g_signal_connect (source, "drag-begin", G_CALLBACK (gtk_color_swatch_drag_begin), swatch);
static GParamSpec *properties[NUM_PROPERTIES];
enum {
+ PREPARE,
DRAG_BEGIN,
DRAG_END,
DRAG_FAILED,
static guint signals[NUM_SIGNALS];
+static void gtk_drag_source_dnd_finished_cb (GdkDrag *drag,
+ GtkDragSource *source);
+static void gtk_drag_source_drop_performed_cb (GdkDrag *drag,
+ GtkDragSource *source);
+static void gtk_drag_source_cancel_cb (GdkDrag *drag,
+ GdkDragCancelReason reason,
+ GtkDragSource *source);
+
+
G_DEFINE_TYPE (GtkDragSource, gtk_drag_source, G_TYPE_OBJECT);
static void
gtk_drag_source_init (GtkDragSource *source)
{
+ source->actions = GDK_ACTION_COPY;
}
static void
g_param_spec_flags ("actions",
P_("Actions"),
P_("Supported actions"),
- GDK_TYPE_DRAG_ACTION, 0,
+ GDK_TYPE_DRAG_ACTION, GDK_ACTION_COPY,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
+ signals[PREPARE] =
+ g_signal_new (I_("prepare"),
+ G_TYPE_FROM_CLASS (class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ NULL,
+ G_TYPE_NONE, 2,
+ G_TYPE_DOUBLE, G_TYPE_DOUBLE);
+
/**
* GtkDragSource::drag-begin:
* @source: the #GtkDragSource
GDK_TYPE_DRAG_CANCEL_REASON);
}
-static void gtk_drag_source_dnd_finished_cb (GdkDrag *drag,
- GtkDragSource *source);
-static void gtk_drag_source_drop_performed_cb (GdkDrag *drag,
- GtkDragSource *source);
-static void gtk_drag_source_cancel_cb (GdkDrag *drag,
- GdkDragCancelReason reason,
- GtkDragSource *source);
-
static void
drag_end (GtkDragSource *source,
gboolean success)
dx = round (px) - x;
dy = round (py) - y;
+ g_signal_emit (source, signals[PREPARE], 0, x, y);
+
+ if (source->content == NULL || source->actions == 0)
+ return;
+
source->drag = gdk_drag_begin (surface, device, source->content, source->actions, dx, dy);
+
if (source->drag == NULL)
{
g_print ("no drag :(\n");
/**
* gtk_drag_source_new:
- * @content: (nullable): the #GdkContentProvider to use, or %NULL
- * @actions: the actions to offer
*
* Creates a new #GtkDragSource object.
*
* Returns: the new #GtkDragSource
*/
GtkDragSource *
-gtk_drag_source_new (GdkContentProvider *content,
- GdkDragAction actions)
+gtk_drag_source_new (void)
{
- return g_object_new (GTK_TYPE_DRAG_SOURCE,
- "content", content,
- "actions", actions,
- NULL);
+ return g_object_new (GTK_TYPE_DRAG_SOURCE, NULL);
}
/**
GType gtk_drag_source_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
-GtkDragSource *gtk_drag_source_new (GdkContentProvider *content,
- GdkDragAction actions);
+GtkDragSource *gtk_drag_source_new (void);
GDK_AVAILABLE_IN_ALL
void gtk_drag_source_set_content (GtkDragSource *source,
GdkDevice *device;
icon_info->in_drag = TRUE;
- source = gtk_drag_source_new (icon_info->content, icon_info->actions);
+ source = gtk_drag_source_new ();
+ gtk_drag_source_set_content (source, icon_info->content);
+ gtk_drag_source_set_actions (source, icon_info->actions);
paintable = gtk_widget_paintable_new (icon_info->widget);
gtk_drag_source_set_icon (source, paintable, -2, -2);
g_object_unref (paintable);
g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), NULL);
+ icon_view->priv->source = gtk_drag_source_new ();
content = gdk_content_provider_new_with_formats (formats, gtk_icon_view_drag_data_get, icon_view);
- icon_view->priv->source = gtk_drag_source_new (content, actions);
+ gtk_drag_source_set_content (icon_view->priv->source, content);
+ gtk_drag_source_set_actions (icon_view->priv->source, actions);
g_object_unref (content);
g_signal_connect (icon_view->priv->source, "drag-begin",
GdkPaintable *paintable;
GdkDevice *device;
- source = gtk_drag_source_new (info->provider, GDK_ACTION_COPY);
+ source = gtk_drag_source_new ();
+ gtk_drag_source_set_content (source, info->provider);
paintable = get_selection_paintable (label);
gtk_drag_source_set_icon (source, paintable, 9, 0);
g_clear_object (&paintable);
g_signal_connect (link_button, "query-tooltip",
G_CALLBACK (gtk_link_button_query_tooltip_cb), NULL);
+ source = gtk_drag_source_new ();
content = g_object_new (GTK_TYPE_LINK_CONTENT, NULL);
GTK_LINK_CONTENT (content)->link = link_button;
- source = gtk_drag_source_new (content, GDK_ACTION_COPY);
+ gtk_drag_source_set_content (source, content);
g_object_unref (content);
gtk_drag_source_attach (source, GTK_WIDGET (link_button), GDK_BUTTON1_MASK);
priv->detached_tab = priv->cur_page;
+ source = gtk_drag_source_new ();
content = gdk_content_provider_new_with_formats (priv->source_targets, gtk_notebook_drag_data_get, widget);
- source = gtk_drag_source_new (content, GDK_ACTION_MOVE);
+ gtk_drag_source_set_content (source, content);
g_object_unref (content);
+ gtk_drag_source_set_actions (source, GDK_ACTION_MOVE);
g_signal_connect (source, "drag-begin", G_CALLBACK (gtk_notebook_drag_begin), notebook);
g_signal_connect (source, "drag-end", G_CALLBACK (gtk_notebook_drag_end), notebook);
g_value_init (&value, G_TYPE_FILE);
g_value_set_object (&value, button_data->file);
+ source = gtk_drag_source_new ();
content = gdk_content_provider_new_for_value (&value);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY);
- gtk_drag_source_attach (source, button_data->button, GDK_BUTTON1_MASK);
+ gtk_drag_source_set_content (source, content);
g_object_unref (content);
+ gtk_drag_source_attach (source, button_data->button, GDK_BUTTON1_MASK);
g_value_unset (&value);
return button_data;
sidebar->dragging_over = TRUE;
+ source = gtk_drag_source_new ();
content = gdk_content_provider_new_with_formats (sidebar->source_targets,
drag_data_get_callback,
sidebar);
- source = gtk_drag_source_new (content, GDK_ACTION_MOVE);
+ gtk_drag_source_set_content (source, content);
g_object_unref (content);
+ gtk_drag_source_set_actions (source, GDK_ACTION_MOVE);
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin_callback), sidebar);
g_signal_connect (source, "drag-end", G_CALLBACK (drag_end_callback), sidebar);
paintable = gtk_text_util_create_drag_icon (widget, text, -1);
- source = gtk_drag_source_new (priv->selection_content,
- priv->editable ? GDK_ACTION_COPY | GDK_ACTION_MOVE
- : GDK_ACTION_COPY);
+ source = gtk_drag_source_new ();
+ gtk_drag_source_set_content (source, priv->selection_content);
+ if (priv->editable)
+ gtk_drag_source_set_actions (source, GDK_ACTION_COPY|GDK_ACTION_MOVE);
gtk_drag_source_set_icon (source,
paintable,
priv->drag_start_x - ranges[0],
else
actions = GDK_ACTION_COPY;
content = gtk_text_buffer_get_selection_content (buffer);
- source = gtk_drag_source_new (content, actions);
+ source = gtk_drag_source_new ();
+ gtk_drag_source_set_content (source, content);
+ gtk_drag_source_set_actions (source, actions);
g_object_unref (content);
if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
{
di = ensure_info (tree_view);
content = gdk_content_provider_new_with_formats (formats, gtk_tree_view_drag_data_get, tree_view);
- di->source = gtk_drag_source_new (content, actions);
+ di->source = gtk_drag_source_new ();
+ gtk_drag_source_set_content (di->source, content);
+ gtk_drag_source_set_actions (di->source, actions);
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);
button = gtk_button_new_with_label ("Drag Here\n");
+ source = gtk_drag_source_new ();
g_value_init (&value, G_TYPE_STRING);
g_value_set_string (&value, "I'm data!");
content = gdk_content_provider_new_for_value (&value);
g_value_unset (&value);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY | GDK_ACTION_MOVE);
+ gtk_drag_source_set_content (source, content);
+ g_object_unref (content);
+ gtk_drag_source_set_actions (source, GDK_ACTION_COPY|GDK_ACTION_MOVE);
gtk_drag_source_attach (source, button, GDK_BUTTON1_MASK | GDK_BUTTON3_MASK);
gtk_drag_source_set_icon (source, GDK_PAINTABLE (texture), 0, 0);
formats = gtk_content_formats_add_text_targets (formats);
content = gdk_content_provider_new_with_formats (formats, get_data, image);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_ASK);
+ source = gtk_drag_source_new ();
+ gtk_drag_source_set_content (source, content);
+ gtk_drag_source_set_actions (source, GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_ASK);
g_object_unref (content);
update_source_icon (source, icon_name, hotspot);
g_value_init (&value, G_TYPE_STRING);
g_value_set_string (&value, "ACTIVE");
content = gdk_content_provider_new_for_value (&value);
- source = gtk_drag_source_new (content, GDK_ACTION_COPY);
+ source = gtk_drag_source_new ();
+ gtk_drag_source_set_content (source, content);
g_signal_connect (source, "drag-begin", G_CALLBACK (spinner_drag_begin), spinner);
gtk_drag_source_attach (source, spinner, GDK_BUTTON1_MASK);
bytes = g_bytes_new (&row, sizeof (gpointer));
content = gdk_content_provider_new_for_bytes ("GTK_LIST_BOX_ROW", bytes);
- source = gtk_drag_source_new (content, GDK_ACTION_MOVE);
+ source = gtk_drag_source_new ();
+ gtk_drag_source_set_content (source, content);
+ gtk_drag_source_set_actions (source, GDK_ACTION_MOVE);
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), image);
gtk_drag_source_attach (source, image, GDK_BUTTON1_MASK);
targets = gdk_content_formats_new (target_table, G_N_ELEMENTS (target_table));
content = gdk_content_provider_new_for_bytes (target_table[0], g_bytes_new ("", 1));
- source = gtk_drag_source_new (content, GDK_ACTION_MOVE);
+ source = gtk_drag_source_new ();
+ gtk_drag_source_set_content (source, content);
+ gtk_drag_source_set_actions (source, GDK_ACTION_MOVE);
g_object_unref (content);
gtk_drag_source_attach (source, button, GDK_BUTTON1_MASK);
dest = gtk_drop_target_new (targets, GDK_ACTION_MOVE);