static void nemo_icon_container_dropped_icon_feedback (GtkWidget *widget, GtkSelectionData *data, int x, int y) { NemoIconContainer *container; NemoIconDndInfo *dnd_info; container = NEMO_ICON_CONTAINER (widget); dnd_info = container->details->dnd_info; /* Delete old selection list. */ nemo_drag_destroy_selection_list (dnd_info->drag_info.selection_list); dnd_info->drag_info.selection_list = NULL; /* Delete old shadow if any. */ if (dnd_info->shadow != NULL) { /* FIXME bugzilla.gnome.org 42484: * Is a destroy really sufficient here? Who does the unref? */ eel_canvas_item_destroy (dnd_info->shadow); } /* Build the selection list and the shadow. */ dnd_info->drag_info.selection_list = nemo_drag_build_selection_list (data); dnd_info->shadow = create_selection_shadow (container, dnd_info->drag_info.selection_list); nemo_icon_container_position_shadow (container, x, y); }
static void nemo_icon_container_receive_dropped_icons (NemoIconContainer *container, GdkDragContext *context, int x, int y) { char *drop_target; gboolean local_move_only; double world_x, world_y; gboolean icon_hit; GdkDragAction action, real_action; drop_target = NULL; if (container->details->dnd_info->drag_info.selection_list == NULL) { return; } real_action = gdk_drag_context_get_selected_action (context); if (real_action == GDK_ACTION_ASK) { /* FIXME bugzilla.gnome.org 42485: This belongs in FMDirectoryView, not here. */ /* Check for special case items in selection list */ if (nemo_drag_selection_includes_special_link (container->details->dnd_info->drag_info.selection_list)) { /* We only want to move the trash */ action = GDK_ACTION_MOVE; } else { action = GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK; } real_action = nemo_drag_drop_action_ask (GTK_WIDGET (container), action); } if (real_action > 0) { eel_canvas_window_to_world (EEL_CANVAS (container), x + gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))), y + gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container))), &world_x, &world_y); drop_target = nemo_icon_container_find_drop_target (container, context, x, y, &icon_hit, FALSE); local_move_only = FALSE; if (!icon_hit && real_action == GDK_ACTION_MOVE) { /* we can just move the icon positions if the move ended up in * the item's parent container */ local_move_only = nemo_icon_container_selection_items_local (container, container->details->dnd_info->drag_info.selection_list); } if (local_move_only) { handle_local_move (container, world_x, world_y); } else { handle_nonlocal_move (container, real_action, world_x, world_y, drop_target, icon_hit); } } g_free (drop_target); nemo_drag_destroy_selection_list (container->details->dnd_info->drag_info.selection_list); container->details->dnd_info->drag_info.selection_list = NULL; }
static void drag_end_callback (GtkWidget *widget, GdkDragContext *context, gpointer data) { NemoIconContainer *container; NemoIconDndInfo *dnd_info; container = NEMO_ICON_CONTAINER (widget); dnd_info = container->details->dnd_info; nemo_drag_destroy_selection_list (dnd_info->drag_info.selection_list); dnd_info->drag_info.selection_list = NULL; }
static void free_drag_data (NemoTreeViewDragDest *dest) { dest->details->have_drag_data = FALSE; if (dest->details->drag_data) { gtk_selection_data_free (dest->details->drag_data); dest->details->drag_data = NULL; } if (dest->details->drag_list) { nemo_drag_destroy_selection_list (dest->details->drag_list); dest->details->drag_list = NULL; } g_free (dest->details->direct_save_uri); dest->details->direct_save_uri = NULL; }
static void drag_info_clear (NemoDragSlotProxyInfo *drag_info) { if (!drag_info->have_data) { goto out; } if (drag_info->info == NEMO_ICON_DND_GNOME_ICON_LIST) { nemo_drag_destroy_selection_list (drag_info->data.selection_list); } else if (drag_info->info == NEMO_ICON_DND_URI_LIST) { g_list_free (drag_info->data.uri_list); } else if (drag_info->info == NEMO_ICON_DND_NETSCAPE_URL) { g_free (drag_info->data.netscape_url); } out: drag_info->have_data = FALSE; drag_info->have_valid_data = FALSE; drag_info->desktop_dnd_can_delete_source = FALSE; drag_info->drop_occured = FALSE; }