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); }
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_offer_action (void *data, struct wl_data_offer *wl_data_offer, uint32_t action) { GdkDragContext *drop_context; GdkDisplay *display; GdkDevice *device; GdkSeat *seat; display = gdk_display_get_default (); seat = gdk_display_get_default_seat (display); device = gdk_seat_get_pointer (seat); drop_context = gdk_wayland_device_get_drop_context (device); drop_context->action = _wl_to_gdk_actions (action); if (gdk_drag_context_get_dest_window (drop_context)) _gdk_wayland_drag_context_emit_event (drop_context, GDK_DRAG_MOTION, GDK_CURRENT_TIME); }
static void data_offer_source_actions (void *data, struct wl_data_offer *wl_data_offer, uint32_t source_actions) { GdkDragContext *drop_context; GdkDisplay *display; GdkDevice *device; GdkSeat *seat; display = gdk_display_get_default (); seat = gdk_display_get_default_seat (display); device = gdk_seat_get_pointer (seat); drop_context = gdk_wayland_device_get_drop_context (device); drop_context->actions = _wl_to_gdk_actions (source_actions); GDK_NOTE (EVENTS, g_message ("data offer source actions, offer %p, actions %d", wl_data_offer, source_actions)); if (gdk_drag_context_get_dest_window (drop_context)) _gdk_wayland_drag_context_emit_event (drop_context, GDK_DRAG_MOTION, GDK_CURRENT_TIME); }