summaryrefslogtreecommitdiff
path: root/gtk/gtkdroptarget.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2020-03-02 21:45:59 +0100
committerBenjamin Otte <otte@redhat.com>2020-03-02 21:45:59 +0100
commit2e55c9cf8c03be9a67eb515a4bd973bacf35d701 (patch)
treeba3f3f25292e6a9ba2808437d850bee21a523109 /gtk/gtkdroptarget.c
parent7427f4f311401e45a5d92cda91726606ba96ee8d (diff)
downloadgtk+-2e55c9cf8c03be9a67eb515a4bd973bacf35d701.tar.gz
droptarget: Fast-path local value load
This way, we can ensure that for local same-type drops the GValue is set when ::enter is emitted. This is the common case for dnd between widgets inside larger applications, so it's worth it to speed it up.
Diffstat (limited to 'gtk/gtkdroptarget.c')
-rw-r--r--gtk/gtkdroptarget.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/gtk/gtkdroptarget.c b/gtk/gtkdroptarget.c
index 093fc0af1f..89e91a9a9a 100644
--- a/gtk/gtkdroptarget.c
+++ b/gtk/gtkdroptarget.c
@@ -223,8 +223,30 @@ gtk_drop_target_load_done (GObject *source,
}
static gboolean
+gtk_drop_target_load_local (GtkDropTarget *self,
+ GType type)
+{
+ GdkDrag *drag;
+
+ drag = gdk_drop_get_drag (self->drop);
+ if (drag == NULL)
+ return FALSE;
+
+ g_value_init (&self->value, type);
+ if (gdk_content_provider_get_value (gdk_drag_get_content (drag),
+ &self->value,
+ NULL))
+ return TRUE;
+
+ g_value_unset (&self->value);
+ return FALSE;
+}
+
+static gboolean
gtk_drop_target_load (GtkDropTarget *self)
{
+ GType type;
+
g_assert (self->drop);
if (G_IS_VALUE (&self->value))
@@ -233,10 +255,15 @@ gtk_drop_target_load (GtkDropTarget *self)
if (self->cancellable)
return FALSE;
+ type = gdk_content_formats_match_gtype (self->formats, gdk_drop_get_formats (self->drop));
+
+ if (gtk_drop_target_load_local (self, type))
+ return TRUE;
+
self->cancellable = g_cancellable_new ();
gdk_drop_read_value_async (self->drop,
- gdk_content_formats_match_gtype (self->formats, gdk_drop_get_formats (self->drop)),
+ type,
G_PRIORITY_DEFAULT,
self->cancellable,
gtk_drop_target_load_done,