static void copy_files_to_folder (GthBrowser *browser, GList *files, gboolean move, char *destination_uri, gboolean view_destination) { GthFileData *destination_data; GthFileSource *file_source; CopyToFolderData *data; GthTask *task; destination_data = gth_file_data_new_for_uri (destination_uri, NULL); file_source = gth_main_get_file_source (destination_data->file); data = g_new0 (CopyToFolderData, 1); data->browser = g_object_ref (browser); data->move = move; data->destination = g_file_dup (destination_data->file); data->view_destination = view_destination; task = gth_copy_task_new (file_source, destination_data, move, files, -1); g_signal_connect (task, "completed", G_CALLBACK (copy_complete_cb), data); gth_browser_exec_task (browser, task, GTH_TASK_FLAGS_DEFAULT); g_object_unref (file_source); }
void fm__gth_browser_folder_tree_drag_data_received_cb (GthBrowser *browser, GthFileData *destination, GList *file_list, GdkDragAction action) { GthFileSource *file_source; GthTask *task; if (destination == NULL) return; file_source = gth_main_get_file_source (destination->file); if (file_source == NULL) return; if ((action == GDK_ACTION_MOVE) && ! gth_file_source_can_cut (file_source, (GFile *) file_list->data)) { GtkWidget *dialog; int response; dialog = _gtk_message_dialog_new (GTK_WINDOW (browser), GTK_DIALOG_MODAL, GTK_STOCK_DIALOG_QUESTION, _("Could not move the files"), _("Files cannot be moved to the current location, as alternative you can choose to copy them."), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_COPY, GTK_RESPONSE_OK, NULL); response = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); if (response == GTK_RESPONSE_CANCEL) return; action = GDK_ACTION_COPY; } task = gth_copy_task_new (file_source, destination, (action == GDK_ACTION_MOVE), file_list, -1); gth_browser_exec_task (browser, task, FALSE); g_object_unref (task); g_object_unref (file_source); }
static void gth_file_list_drag_data_received (GtkWidget *file_view, GdkDragContext *context, int x, int y, GtkSelectionData *selection_data, guint info, guint time, gpointer user_data) { GthBrowser *browser = user_data; gboolean success = FALSE; char **uris; GList *selected_files; GdkDragAction action; g_signal_stop_emission_by_name (file_view, "drag-data-received"); action = gdk_drag_context_get_suggested_action (context); if (action == GDK_ACTION_COPY || action == GDK_ACTION_MOVE) { success = TRUE; } if (action == GDK_ACTION_ASK) { GdkDragAction actions = _gtk_menu_ask_drag_drop_action (file_view, gdk_drag_context_get_actions (context), time); gdk_drag_status (context, actions, time); success = gdk_drag_context_get_selected_action (context) != 0; } if (gtk_selection_data_get_data_type (selection_data) == XDND_ACTION_DIRECT_SAVE_ATOM) { const guchar *data; int format; int length; data = gtk_selection_data_get_data (selection_data); format = gtk_selection_data_get_format (selection_data); length = gtk_selection_data_get_length (selection_data); if ((format == 8) && (length == 1) && (data[0] == 'S')) { success = TRUE; } else { gdk_property_change (gdk_drag_context_get_dest_window (context), XDND_ACTION_DIRECT_SAVE_ATOM, TEXT_PLAIN_ATOM, 8, GDK_PROP_MODE_REPLACE, (const guchar *) "", 0); success = FALSE; } gtk_drag_finish (context, success, FALSE, time); return; } gtk_drag_finish (context, success, FALSE, time); if (! success) return; uris = gtk_selection_data_get_uris (selection_data); selected_files = _g_file_list_new_from_uriv (uris); if (selected_files != NULL) { if (gtk_drag_get_source_widget (context) == file_view) { GList *file_data_list; GList *visible_files; BrowserData *data; GthTask *task; file_data_list = gth_file_store_get_visibles (gth_browser_get_file_store (browser)); visible_files = gth_file_data_list_to_file_list (file_data_list); data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY); task = gth_reorder_task_new (gth_browser_get_location_source (browser), gth_browser_get_location_data (browser), visible_files, selected_files, data->drop_pos); gth_browser_exec_task (browser, task, FALSE); g_object_unref (task); _g_object_list_unref (visible_files); _g_object_list_unref (file_data_list); } else { GthFileSource *file_source; gboolean cancel = FALSE; gboolean move; file_source = gth_browser_get_location_source (browser); move = gdk_drag_context_get_selected_action (context) == GDK_ACTION_MOVE; if (move && ! gth_file_source_can_cut (file_source, (GFile *) selected_files->data)) { GtkWidget *dialog; int response; dialog = _gtk_message_dialog_new (GTK_WINDOW (browser), GTK_DIALOG_MODAL, GTK_STOCK_DIALOG_QUESTION, _("Could not move the files"), _("Files cannot be moved to the current location, as alternative you can choose to copy them."), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_COPY, GTK_RESPONSE_OK, NULL); response = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); if (response == GTK_RESPONSE_CANCEL) cancel = TRUE; move = FALSE; } if (! cancel) { GthFileSource *location_source; BrowserData *data; GthTask *task; location_source = gth_main_get_file_source (gth_browser_get_location (browser)); data = g_object_get_data (G_OBJECT (browser), BROWSER_DATA_KEY); task = gth_copy_task_new (location_source, gth_browser_get_location_data (browser), move, selected_files, data->drop_pos); gth_browser_exec_task (browser, task, FALSE); g_object_unref (task); g_object_unref (location_source); } } } _g_object_list_unref (selected_files); g_strfreev (uris); }
static void clipboard_received_cb (GtkClipboard *clipboard, GtkSelectionData *selection_data, gpointer user_data) { PasteData *paste_data = user_data; GthBrowser *browser = paste_data->browser; const char *raw_data; char **clipboard_data; int i; GtkTreePath *path; int position; GthTask *task; raw_data = (const char *) gtk_selection_data_get_data (selection_data); if (raw_data == NULL) { paste_data_free (paste_data); return; } clipboard_data = g_strsplit_set (raw_data, "\n\r", -1); if ((clipboard_data == NULL) || (clipboard_data[0] == NULL)) { g_strfreev (clipboard_data); paste_data_free (paste_data); return; } paste_data->cut = strcmp (clipboard_data[0], "cut") == 0; paste_data->files = NULL; for (i = 1; clipboard_data[i] != NULL; i++) if (strcmp (clipboard_data[i], "") != 0) paste_data->files = g_list_prepend (paste_data->files, g_file_new_for_uri (clipboard_data[i])); paste_data->files = g_list_reverse (paste_data->files); paste_data->file_source = gth_main_get_file_source (paste_data->destination->file); if (paste_data->cut && ! gth_file_source_can_cut (paste_data->file_source, paste_data->files->data)) { GtkWidget *dialog; int response; dialog = _gtk_message_dialog_new (GTK_WINDOW (browser), GTK_DIALOG_MODAL, _GTK_ICON_NAME_DIALOG_QUESTION, _("Could not move the files"), _("Files cannot be moved to the current location, as alternative you can choose to copy them."), _GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL, _("Copy"), GTK_RESPONSE_OK, NULL); response = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); if (response == GTK_RESPONSE_CANCEL) { paste_data_free (paste_data); return; } paste_data->cut = FALSE; } position = -1; path = gth_file_selection_get_last_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser))); if (path != NULL) { int *indices; indices = gtk_tree_path_get_indices (path); if (indices != NULL) position = indices[0] + 1; gtk_tree_path_free (path); } task = gth_copy_task_new (paste_data->file_source, paste_data->destination, paste_data->cut, paste_data->files, position); gth_browser_exec_task (browser, task, GTH_TASK_FLAGS_DEFAULT); g_object_unref (task); paste_data_free (paste_data); }