static void fm_dnd_src_finalize(GObject *object) { FmDndSrc *ds; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_DND_SRC(object)); ds = FM_DND_SRC(object); if(ds->files) fm_list_unref(ds->files); fm_dnd_src_set_widget(ds, NULL); G_OBJECT_CLASS(fm_dnd_src_parent_class)->finalize(object); }
void fm_folder_view_set_mode(FmFolderView* fv, FmFolderViewMode mode) { if( mode != fv->mode ) { GtkTreeSelection* ts; GList *sels, *cells; FmFolderModel* model = (FmFolderModel*)fv->model; gboolean has_focus; if( G_LIKELY(fv->view) ) { has_focus = GTK_WIDGET_HAS_FOCUS(fv->view); /* preserve old selections */ sels = fm_folder_view_get_selected_tree_paths(fv); g_signal_handlers_disconnect_by_func(fv->view, on_drag_motion, fv); g_signal_handlers_disconnect_by_func(fv->view, on_drag_leave, fv); g_signal_handlers_disconnect_by_func(fv->view, on_drag_drop, fv); g_signal_handlers_disconnect_by_func(fv->view, on_drag_data_received, fv); fm_dnd_unset_dest_auto_scroll(fv->view); gtk_widget_destroy(fv->view ); /* FIXME: compact view and icon view actually use the same * type of widget, ExoIconView. So it may be better to * reuse the widget when available. */ } else { sels = NULL; has_focus = FALSE; } if(fv->icon_size_changed_handler) { g_signal_handler_disconnect(fm_config, fv->icon_size_changed_handler); fv->icon_size_changed_handler = 0; } fv->mode = mode; switch(fv->mode) { case FM_FV_COMPACT_VIEW: case FM_FV_ICON_VIEW: case FM_FV_THUMBNAIL_VIEW: create_icon_view(fv, sels); break; case FM_FV_LIST_VIEW: /* detailed list view */ create_list_view(fv, sels); } g_list_foreach(sels, (GFunc)gtk_tree_path_free, NULL); g_list_free(sels); /* FIXME: maybe calling set_icon_size here is a good idea */ gtk_drag_source_set(fv->view, GDK_BUTTON1_MASK, fm_default_dnd_src_targets, N_FM_DND_SRC_DEFAULT_TARGETS, GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_LINK|GDK_ACTION_ASK); fm_dnd_src_set_widget(fv->dnd_src, fv->view); gtk_drag_dest_set(fv->view, 0, fm_default_dnd_dest_targets, N_FM_DND_DEST_DEFAULT_TARGETS, GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_LINK|GDK_ACTION_ASK); fm_dnd_dest_set_widget(fv->dnd_dest, fv->view); g_signal_connect_after(fv->view, "drag-motion", G_CALLBACK(on_drag_motion), fv); g_signal_connect(fv->view, "drag-leave", G_CALLBACK(on_drag_leave), fv); g_signal_connect(fv->view, "drag-drop", G_CALLBACK(on_drag_drop), fv); g_signal_connect(fv->view, "drag-data-received", G_CALLBACK(on_drag_data_received), fv); g_signal_connect(fv->view, "button-press-event", G_CALLBACK(on_btn_pressed), fv); fm_dnd_set_dest_auto_scroll(fv->view, gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(fv)), gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(fv))); gtk_widget_show(fv->view); gtk_container_add((GtkContainer*)fv, fv->view); if(has_focus) /* restore the focus if needed. */ gtk_widget_grab_focus(fv->view); } else { /* g_debug("same mode"); */ } }
FmDndSrc *fm_dnd_src_new(GtkWidget* w) { FmDndSrc* ds = (FmDndSrc*)g_object_new(FM_TYPE_DND_SRC, NULL); fm_dnd_src_set_widget(ds, w); return ds; }