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_cancelled (void *data, struct wl_data_source *source) { GdkWaylandSelection *wayland_selection = data; GdkDragContext *context; GdkDisplay *display; GdkAtom atom; GDK_NOTE (EVENTS, g_message ("data source cancelled, source = %p", 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; context = gdk_wayland_drag_context_lookup_by_data_source (source); if (context) gdk_drag_context_cancel (context, GDK_DRAG_CANCEL_ERROR); emit_selection_clear (display, atom); gdk_selection_owner_set (NULL, atom, GDK_CURRENT_TIME, TRUE); gdk_wayland_selection_unset_data_source (display, atom); }
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_dnd_drop_performed (void *data, struct wl_data_source *source) { GdkDragContext *context; context = gdk_wayland_drag_context_lookup_by_data_source (source); if (!context) return; g_signal_emit_by_name (context, "drop-performed", GDK_CURRENT_TIME); }
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_action (void *data, struct wl_data_source *source, uint32_t action) { GdkDragContext *context; GDK_NOTE (EVENTS, g_message ("data source action, source = %p action=%x", source, action)); context = gdk_wayland_drag_context_lookup_by_data_source (source); if (!context) return; context->action = _wl_to_gdk_actions (action); g_signal_emit_by_name (context, "action-changed", context->action); }
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_dnd_finished (void *data, struct wl_data_source *source) { GdkDisplay *display = gdk_display_get_default (); GdkDragContext *context; context = gdk_wayland_drag_context_lookup_by_data_source (source); if (!context) return; if (context->action == GDK_ACTION_MOVE) { gdk_wayland_selection_emit_request (context->source_window, atoms[ATOM_DND], gdk_atom_intern_static_string ("DELETE")); } g_signal_emit_by_name (context, "dnd-finished"); gdk_selection_owner_set (NULL, atoms[ATOM_DND], GDK_CURRENT_TIME, TRUE); gdk_wayland_selection_clear_targets (display, atoms[ATOM_DND]); }