/** * fm_move_or_copy_files_to * @parent: a window to place progress dialog over it * @files: list of files * @is_move: %TRUE to move, %FALSE to copy * * Opens a dialog to choose destination directory. If it was not cancelled * by user then moves or copies @files into chosen directory with progress * dialog. * * Before 0.1.15 this call had different arguments. * * Since: 0.1.0 */ void fm_move_or_copy_files_to(GtkWindow* parent, FmPathList* files, gboolean is_move) { FmPath* dest = fm_select_folder(parent, NULL); if(dest) { if(is_move) fm_move_files(parent, files, dest); else fm_copy_files(parent, files, dest); fm_path_unref(dest); } }
gboolean fm_dnd_dest_files_dropped(FmDndDest* dd, GdkDragAction action, int info_type, FmList* files) { FmPath* dest; GtkWidget* parent; dest = fm_dnd_dest_get_dest_path(dd); if(!dest) return FALSE; g_debug("%d files-dropped!, info_type: %d", fm_list_get_length(files), info_type); if(fm_list_is_file_info_list(files)) files = fm_path_list_new_from_file_info_list(files); else fm_list_ref(files); parent = gtk_widget_get_toplevel(dd->widget); switch(action) { case GDK_ACTION_MOVE: if(fm_path_is_trash_root(fm_dnd_dest_get_dest_path(dd))) fm_trash_files(GTK_WINDOW(parent), files); else fm_move_files(GTK_WINDOW(parent), files, fm_dnd_dest_get_dest_path(dd)); break; case GDK_ACTION_COPY: fm_copy_files(GTK_WINDOW(parent), files, fm_dnd_dest_get_dest_path(dd)); break; case GDK_ACTION_LINK: // fm_link_files(parent, files, fm_dnd_dest_get_dest_path(dd)); break; case GDK_ACTION_ASK: g_debug("TODO: GDK_ACTION_ASK"); break; } fm_list_unref(files); return TRUE; }
void on_dnd_dest_files_dropped(FmDndDest* dd, GdkDragAction action, int info_type, FmList* files, FmPlacesView* view) { FmPath* dest; GList* l; dest = fm_dnd_dest_get_dest_path(dd); g_debug("action= %d, %d files-dropped!, info_type: %d", action, fm_list_get_length(files), info_type); if(action != GDK_ACTION_LINK) { if(fm_list_is_file_info_list(files)) files = fm_path_list_new_from_file_info_list(files); else fm_list_ref(files); } switch(action) { case GDK_ACTION_MOVE: if(fm_path_is_trash_root(dest)) fm_trash_files(files); else fm_move_files(files, dest); break; case GDK_ACTION_COPY: fm_copy_files(files, dest); break; case GDK_ACTION_LINK: { GtkTreePath* tp = view->dest_row; if(tp) { GtkTreePath* sep = gtk_tree_model_get_path(GTK_TREE_MODEL(model), &sep_it); int idx = gtk_tree_path_get_indices(tp)[0] - gtk_tree_path_get_indices(sep)[0]; gtk_tree_path_free(sep); if(view->dest_pos == GTK_TREE_VIEW_DROP_BEFORE) --idx; for( l=fm_list_peek_head_link(files); l; l=l->next, ++idx ) { FmBookmarkItem* item; if(fm_list_is_file_info_list(files)) { FmFileInfo* fi = (FmFileInfo*)l->data; item = fm_bookmarks_insert( bookmarks, fi->path, fi->disp_name, idx); } else { FmPath* path = (FmPath*)l->data; char* disp_name = g_filename_display_name(path->name); item = fm_bookmarks_insert( bookmarks, path, disp_name, idx); g_free(disp_name); } /* we don't need to add item to places view. Later the bookmarks will be reloaded. */ } } } break; } fm_list_unref(files); if(view->dest_row) { gtk_tree_path_free(view->dest_row); view->dest_row = NULL; } }
gboolean fm_clipboard_paste_files(GtkWidget* dest_widget, FmPath* dest_dir) { GdkDisplay* dpy = dest_widget ? gtk_widget_get_display(dest_widget) : gdk_display_get_default(); GtkClipboard* clip = gtk_clipboard_get_for_display(dpy, GDK_SELECTION_CLIPBOARD); FmPathList* files; char** uris, **uri; GdkAtom atom; int type = 0; GdkAtom *avail_targets; int n, i; /* get all available targets currently in the clipboard. */ if( !gtk_clipboard_wait_for_targets(clip, &avail_targets, &n) ) return FALSE; /* check gnome and xfce compatible format first */ atom = gdk_atom_intern_static_string(targets[GNOME_COPIED_FILES-1].target); for(i = 0; i < n; ++i) { if(avail_targets[i] == atom) { type = GNOME_COPIED_FILES; break; } } if( 0 == type ) /* x-special/gnome-copied-files is not found. */ { /* check uri-list */ atom = gdk_atom_intern_static_string(targets[URI_LIST-1].target); for(i = 0; i < n; ++i) { if(avail_targets[i] == atom) { type = URI_LIST; break; } } if( 0 == type ) /* text/uri-list is not found. */ { /* finally, fallback to UTF-8 string */ atom = gdk_atom_intern_static_string(targets[UTF8_STRING-1].target); for(i = 0; i < n; ++i) { if(avail_targets[i] == atom) { type = UTF8_STRING; break; } } } } g_free(avail_targets); if( type ) { GtkSelectionData* data = gtk_clipboard_wait_for_contents(clip, atom); char* pdata = (char*)data->data; /* FIXME: is it safe to assume the clipboard data is null-terminalted? * According to the source code in gtkselection.c, gtk+ seems to * includes an extra byte at the end of GtkSelectionData::data, so * this should be safe. */ pdata[data->length] = '\0'; /* make sure the data is null-terminated. */ is_cut = FALSE; switch(type) { case GNOME_COPIED_FILES: is_cut = g_str_has_prefix(pdata, "cut\n"); while(*pdata && *pdata != '\n') ++pdata; ++pdata; /* the following parts is actually a uri-list, so don't break here. */ case URI_LIST: uris = g_uri_list_extract_uris(pdata); if( type != GNOME_COPIED_FILES ) { /* if we're not handling x-special/gnome-copied-files, check * if information from KDE is available. */ is_cut = check_kde_curselection(clip); } break; case UTF8_STRING: /* FIXME: how should we treat UTF-8 strings? URIs or filenames? */ uris = g_uri_list_extract_uris(pdata); break; } gtk_selection_data_free(data); if(uris) { files = fm_path_list_new_from_uris((const char **)uris); g_strfreev(uris); if( is_cut ) fm_move_files(files, dest_dir); else fm_copy_files(files, dest_dir); fm_list_unref(files); return TRUE; } } return FALSE; }