static gboolean list_contains_path(FmList *lst, FmPath *pth) { if(!lst) return FALSE; if(fm_list_is_file_info_list(lst)) return !!fm_list_find_custom(lst, pth, _compare_finfo); if(fm_list_is_path_list(lst)) return !!fm_list_find_custom(lst, pth, _compare_path); }
inline static gboolean cache_src_file_infos(FmDndDest* dd, GtkWidget *dest_widget, gint x, gint y, GdkDragContext *drag_context) { GdkAtom target; target = gtk_drag_dest_find_target( dest_widget, drag_context, NULL ); if( target != GDK_NONE ) { GdkDragAction action; gboolean ret; /* treat X direct save as a special case. */ if( target == gdk_atom_intern_static_string("XdndDirectSave0") ) { /* FIXME: need a better way to handle this. */ action = drag_context->suggested_action; g_signal_emit(dd, signals[QUERY_INFO], 0, x, y, &action, &ret); gdk_drag_status(drag_context, action, time); return TRUE; } /* g_debug("try to cache src_files"); */ dd->mainloop = g_main_loop_new(NULL, TRUE); gtk_drag_get_data(dest_widget, drag_context, target, time); /* run the main loop to block here waiting for * 'drag-data-received' signal being handled first. */ /* it's possible that g_main_loop_quit is called before we really run the loop. */ if(g_main_loop_is_running(dd->mainloop)) g_main_loop_run(dd->mainloop); g_main_loop_unref(dd->mainloop); dd->mainloop = NULL; /* g_debug("src_files cached: %p", dd->src_files); */ /* dd->src_files should be set now */ if( dd->src_files && fm_list_is_file_info_list(dd->src_files) ) { /* cache file system id of source files */ if( fm_file_info_list_is_same_fs(dd->src_files) ) { FmFileInfo* fi = (FmFileInfo*)fm_list_peek_head(dd->src_files); if(fm_path_is_native(fi->path)) dd->src_dev = fi->dev; else dd->src_fs_id = fi->fs_id; } } } return FALSE; }
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; } }