static void primary_source_send (void *data, struct gtk_primary_selection_source *source, const char *mime_type, int32_t fd) { GdkWaylandSelection *wayland_selection = data; GDK_NOTE (EVENTS, g_message ("primary source send, source = %p, mime_type = %s, fd = %d", source, mime_type, fd)); if (!mime_type || !wayland_selection->primary_owner) { close (fd); return; } if (!gdk_wayland_selection_request_target (wayland_selection, wayland_selection->primary_owner, atoms[ATOM_PRIMARY], gdk_atom_intern (mime_type, FALSE), fd)) gdk_wayland_selection_check_write (wayland_selection); }
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)); } }
static void data_source_send (void *data, struct wl_data_source *source, const char *mime_type, int32_t fd) { GdkWaylandSelection *wayland_selection = data; GdkWindow *window; GdkAtom selection; GDK_NOTE (EVENTS, g_message ("data source send, source = %p, mime_type = %s, fd = %d", source, mime_type, fd)); if (!mime_type) { close (fd); return; } if (source == wayland_selection->dnd_source) { window = wayland_selection->dnd_owner; selection = atoms[ATOM_DND]; } else if (source == wayland_selection->clipboard_source) { window = wayland_selection->clipboard_owner; selection = atoms[ATOM_CLIPBOARD]; } else { close (fd); return; } if (!window) return; if (!gdk_wayland_selection_request_target (wayland_selection, window, selection, gdk_atom_intern (mime_type, FALSE), fd)) gdk_wayland_selection_check_write (wayland_selection); }
static void data_source_target (void *data, struct wl_data_source *source, const char *mime_type) { GdkWaylandSelection *wayland_selection = data; GdkDragContext *context = NULL; GdkWindow *window = NULL; g_debug (G_STRLOC ": %s source = %p, mime_type = %s", G_STRFUNC, source, mime_type); context = gdk_wayland_drag_context_lookup_by_data_source (source); if (!mime_type) { if (context) { gdk_wayland_drag_context_set_action (context, 0); _gdk_wayland_drag_context_emit_event (context, GDK_DRAG_STATUS, GDK_CURRENT_TIME); } return; } if (source == wayland_selection->dnd_source) { window = wayland_selection->dnd_owner; gdk_wayland_drag_context_set_action (context, GDK_ACTION_COPY); _gdk_wayland_drag_context_emit_event (context, GDK_DRAG_STATUS, GDK_CURRENT_TIME); } else if (source == wayland_selection->clipboard_source) window = wayland_selection->clipboard_owner; if (!window) return; gdk_wayland_selection_request_target (wayland_selection, window, gdk_atom_intern (mime_type, FALSE), -1); }