diff options
author | Benjamin Otte <otte@redhat.com> | 2020-03-02 21:45:59 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2020-03-02 21:45:59 +0100 |
commit | 2e55c9cf8c03be9a67eb515a4bd973bacf35d701 (patch) | |
tree | ba3f3f25292e6a9ba2808437d850bee21a523109 /gtk/gtkdroptarget.c | |
parent | 7427f4f311401e45a5d92cda91726606ba96ee8d (diff) | |
download | gtk+-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.c | 29 |
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, |