summaryrefslogtreecommitdiff
path: root/gtk/gtkdragsource.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkdragsource.c')
-rw-r--r--gtk/gtkdragsource.c47
1 files changed, 30 insertions, 17 deletions
diff --git a/gtk/gtkdragsource.c b/gtk/gtkdragsource.c
index 6fa40897f4..68a0a344df 100644
--- a/gtk/gtkdragsource.c
+++ b/gtk/gtkdragsource.c
@@ -107,6 +107,7 @@ enum {
static GParamSpec *properties[NUM_PROPERTIES];
enum {
+ PREPARE,
DRAG_BEGIN,
DRAG_END,
DRAG_FAILED,
@@ -115,11 +116,21 @@ enum {
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
@@ -216,11 +227,21 @@ gtk_drag_source_class_init (GtkDragSourceClass *class)
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
@@ -287,14 +308,6 @@ gtk_drag_source_class_init (GtkDragSourceClass *class)
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)
@@ -390,7 +403,13 @@ gtk_drag_source_drag_begin (GtkDragSource *source,
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");
@@ -439,21 +458,15 @@ gtk_drag_source_drag_begin (GtkDragSource *source,
/**
* 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);
}
/**