wayland: Use a magic mime type for local DND

Otherwise the compositor gets all confused when it's trying to make
drag happen but we know it's not going to happen.

After all, we exchange data behind its back, we just need to keep it
informed.
This commit is contained in:
Benjamin Otte
2020-02-15 21:04:57 +01:00
parent 894ac6c126
commit 46bbb397e1
4 changed files with 19 additions and 0 deletions

View File

@@ -1127,6 +1127,10 @@ data_offer_offer (void *data,
return;
}
/* skip magic mime types */
if (g_str_equal (type, GDK_WAYLAND_LOCAL_DND_MIME_TYPE))
return;
gdk_content_formats_builder_add_mime_type (seat->pending_builder, type);
}

View File

@@ -358,6 +358,7 @@ gdk_wayland_drag_create_data_source (GdkDrag *drag)
g_message ("create data source, mime types=%s", s);
g_free (s);});
wl_data_source_offer (drag_wayland->data_source, GDK_WAYLAND_LOCAL_DND_MIME_TYPE);
for (i = 0; i < n_mimetypes; i++)
wl_data_source_offer (drag_wayland->data_source, mimetypes[i]);

View File

@@ -97,6 +97,13 @@ gdk_wayland_drop_drop_set_status (GdkWaylandDrop *drop_wayland,
const char *const *mimetypes;
gsize i, n_mimetypes;
/* This is a local drag, treat it like that */
if (gdk_drop_get_drag (GDK_DROP (drop_wayland)))
{
wl_data_offer_accept (drop_wayland->offer, drop_wayland->serial, GDK_WAYLAND_LOCAL_DND_MIME_TYPE);
return;
}
mimetypes = gdk_content_formats_get_mime_types (gdk_drop_get_formats (GDK_DROP (drop_wayland)), &n_mimetypes);
for (i = 0; i < n_mimetypes; i++)
{

View File

@@ -44,6 +44,13 @@
#define WL_SURFACE_HAS_BUFFER_SCALE 3
#define WL_POINTER_HAS_FRAME 5
/* the magic mime type we use for local DND operations.
* We offer it to every dnd operation, but will strip it out on the drop
* site unless we can prove it's a local DND - then we will use only
* this type
*/
#define GDK_WAYLAND_LOCAL_DND_MIME_TYPE "application/x-gtk-local-dnd"
GdkKeymap *_gdk_wayland_keymap_new (GdkDisplay *display);
void _gdk_wayland_keymap_update_from_fd (GdkKeymap *keymap,
uint32_t format,