static void data_source_cancelled (void *data, struct wl_data_source *source) { GdkWaylandSelection *wayland_selection = data; GdkDragContext *context; GdkDisplay *display; GdkAtom atom; g_debug (G_STRLOC ": %s source = %p", G_STRFUNC, source); display = gdk_display_get_default (); if (source == wayland_selection->dnd_source) atom = atoms[ATOM_DND]; else if (source == wayland_selection->clipboard_source) atom = atoms[ATOM_CLIPBOARD]; else return; gdk_wayland_selection_unset_data_source (display, atom); gdk_selection_owner_set (NULL, atom, GDK_CURRENT_TIME, TRUE); if (source == wayland_selection->dnd_source) { context = gdk_wayland_drag_context_lookup_by_data_source (source); if (context) gdk_wayland_device_unset_grab (gdk_drag_context_get_device (context)); } }
static void data_source_cancelled (void *data, struct wl_data_source *source) { GdkWaylandSelection *wayland_selection = data; GdkDragContext *context; GdkDisplay *display; g_debug (G_STRLOC ": %s source = %p", G_STRFUNC, source); display = gdk_display_get_default (); if (source == wayland_selection->dnd_source) { gdk_wayland_selection_unset_data_source (display, atoms[ATOM_DND]); context = gdk_wayland_drag_context_lookup_by_data_source (source); if (context) gdk_wayland_device_unset_grab (gdk_drag_context_get_device (context)); } else if (source == wayland_selection->clipboard_source) gdk_wayland_selection_unset_data_source (display, atoms[ATOM_CLIPBOARD]); }
static void data_source_send (void *data, struct wl_data_source *source, const char *mime_type, int32_t fd) { GdkWaylandSelection *wayland_selection = data; GdkDragContext *context; GdkWindow *window; g_debug (G_STRLOC ": %s source = %p, mime_type = %s, fd = %d", G_STRFUNC, source, mime_type, fd); if (!mime_type) { close (fd); return; } context = gdk_wayland_drag_context_lookup_by_data_source (source); if (source == wayland_selection->dnd_source) window = wayland_selection->dnd_owner; else if (source == wayland_selection->clipboard_source) window = wayland_selection->clipboard_owner; else { close (fd); return; } if (!window) return; if (!gdk_wayland_selection_request_target (wayland_selection, window, gdk_atom_intern (mime_type, FALSE), fd)) gdk_wayland_selection_check_write (wayland_selection); if (context) { _gdk_wayland_drag_context_emit_event (context, GDK_DROP_FINISHED, GDK_CURRENT_TIME); gdk_wayland_device_unset_grab (gdk_drag_context_get_device (context)); } }