static void fm_folder_view_finalize(GObject *object) { FmFolderView *self; g_return_if_fail(object != NULL); g_return_if_fail(IS_FM_FOLDER_VIEW(object)); self = FM_FOLDER_VIEW(object); if(self->folder) { g_object_unref(self->folder); if( self->model ) g_object_unref(self->model); } g_object_unref(self->dnd_src); g_object_unref(self->dnd_dest); if(self->cwd) fm_path_unref(self->cwd); g_signal_handlers_disconnect_by_func(fm_config, on_single_click_changed, object); cancel_pending_row_activated(self); if(self->icon_size_changed_handler) g_signal_handler_disconnect(fm_config, self->icon_size_changed_handler); if (G_OBJECT_CLASS(fm_folder_view_parent_class)->finalize) (* G_OBJECT_CLASS(fm_folder_view_parent_class)->finalize)(object); }
void fm_main_win_chdir_by_name(FmMainWin* win, const char* path_str) { FmPath* path; gtk_entry_set_text(GTK_ENTRY(win->location), path_str); path = fm_path_new(path_str); fm_folder_view_chdir(FM_FOLDER_VIEW(win->folder_view), path); fm_path_unref(path); }
void fm_tab_page_set_show_hidden(FmTabPage* page, gboolean show_hidden) { fm_folder_view_set_show_hidden(FM_FOLDER_VIEW(page->folder_view), show_hidden); /* update status text */ g_free(page->status_text[FM_STATUS_TEXT_NORMAL]); page->status_text[FM_STATUS_TEXT_NORMAL] = format_status_text(page); g_signal_emit(page, signals[STATUS], 0, FM_STATUS_TEXT_NORMAL, page->status_text[FM_STATUS_TEXT_NORMAL]); }
void on_move_to(GtkAction* act, FmMainWin* win) { FmPathList* files = fm_folder_view_get_selected_file_paths(FM_FOLDER_VIEW(win->folder_view)); if(files) { fm_move_files_to(files); fm_list_unref(files); } }
void on_rename(GtkAction* act, FmMainWin* win) { FmPathList* files = fm_folder_view_get_selected_file_paths(FM_FOLDER_VIEW(win->folder_view)); if( !fm_list_is_empty(files) ) { fm_rename_file(fm_list_peek_head(files)); /* FIXME: is it ok to only rename the first selected file here. */ } fm_list_unref(files); }
void on_prop(GtkAction* action, FmMainWin* win) { FmFolderView* fv = FM_FOLDER_VIEW(win->folder_view); /* FIXME: should prevent directly accessing data members */ FmFileInfo* fi = FM_FOLDER_MODEL(fv->model)->dir->dir_fi; FmFileInfoList* files = fm_file_info_list_new(); fm_list_push_tail(files, fi); fm_show_file_properties(files); fm_list_unref(files); }
GtkWidget *fm_tab_page_new(FmPath* path) { FmTabPage* page = (FmTabPage*)g_object_new(FM_TYPE_TAB_PAGE, NULL); GtkWidget* label; char* disp_name; fm_folder_view_set_show_hidden(FM_FOLDER_VIEW(page->folder_view), app_config->show_hidden); fm_tab_page_chdir(page, path); return page; }
void on_paste(GtkAction* act, FmMainWin* win) { GtkWidget* focus = gtk_window_get_focus((GtkWindow*)win); if(GTK_IS_EDITABLE(focus) ) { gtk_editable_paste_clipboard((GtkEditable*)focus); } else { FmPath* path = fm_folder_view_get_cwd(FM_FOLDER_VIEW(win->folder_view)); fm_clipboard_paste_files(win->folder_view, path); } }
void on_open_in_new_win(GtkAction* act, FmMainWin* win) { FmPathList* sels = fm_folder_view_get_selected_file_paths(FM_FOLDER_VIEW(win->folder_view)); GList* l; for( l = fm_list_peek_head_link(sels); l; l=l->next ) { FmPath* path = (FmPath*)l->data; win = fm_main_win_new(); gtk_window_set_default_size(GTK_WINDOW(win), 640, 480); fm_main_win_chdir(win, path); gtk_window_present(GTK_WINDOW(win)); } fm_list_unref(sels); }
void on_copy(GtkAction* act, FmMainWin* win) { GtkWidget* focus = gtk_window_get_focus((GtkWindow*)win); if(GTK_IS_EDITABLE(focus) && gtk_editable_get_selection_bounds((GtkEditable*)focus, NULL, NULL) ) { gtk_editable_copy_clipboard((GtkEditable*)focus); } else { FmPathList* files = fm_folder_view_get_selected_file_paths(FM_FOLDER_VIEW(win->folder_view)); if(files) { fm_clipboard_copy_files(win, files); fm_list_unref(files); } } }
static void fm_tab_page_init(FmTabPage *page) { GtkPaned* paned = GTK_PANED(page); FmTabLabel* tab_label; FmFolderView* folder_view; GList* focus_chain = NULL; page->side_pane = fm_side_pane_new(); fm_side_pane_set_mode(FM_SIDE_PANE(page->side_pane), app_config->side_pane_mode); /* TODO: add a close button to side pane */ gtk_paned_add1(paned, page->side_pane); focus_chain = g_list_prepend(focus_chain, page->side_pane); page->folder_view = fm_folder_view_new(app_config->view_mode); folder_view = FM_FOLDER_VIEW(page->folder_view); fm_folder_view_set_hint_type(folder_view, app_config->hint_type); fm_folder_view_sort(folder_view, app_config->sort_type, app_config->sort_by); fm_folder_view_set_selection_mode(folder_view, GTK_SELECTION_MULTIPLE); page->nav_history = fm_nav_history_new(); gtk_paned_add2(paned, page->folder_view); focus_chain = g_list_prepend(focus_chain, page->folder_view); /* We need this to change tab order to focus folder view before left pane. */ gtk_container_set_focus_chain(page, focus_chain); g_list_free(focus_chain); gtk_widget_show_all(GTK_WIDGET(page)); /* create tab label */ tab_label = (FmTabLabel*)fm_tab_label_new(""); gtk_label_set_max_width_chars(tab_label->label, app_config->max_tab_chars); gtk_label_set_ellipsize(tab_label->label, PANGO_ELLIPSIZE_END); page->tab_label = GTK_WIDGET(tab_label); g_signal_connect(page->folder_view, "sel-changed", G_CALLBACK(on_folder_view_sel_changed), page); g_signal_connect(page->folder_view, "loaded", G_CALLBACK(on_folder_view_loaded), page); /* the folder view is already loded, call the "loaded" callback ourself. */ if(fm_folder_view_get_is_loaded(folder_view)) on_folder_view_loaded(folder_view, fm_folder_view_get_cwd(folder_view), page); }
static void fm_tab_page_chdir_without_history(FmTabPage* page, FmPath* path) { FmFolderView* folder_view = FM_FOLDER_VIEW(page->folder_view); FmFolder* folder = fm_folder_view_get_folder(folder_view); char * disp_path = fm_path_display_name(path, FALSE); fm_tab_label_set_tooltip_text(FM_TAB_LABEL(page->tab_label), disp_path); g_free(disp_path); char* disp_name = fm_path_display_basename(path); fm_tab_label_set_text(FM_TAB_LABEL(page->tab_label), disp_name); g_free(disp_name); /* disconnect from previous folder */ disconnect_folder(page, folder); /* chdir to a new folder */ fm_folder_view_chdir(folder_view, path); folder = fm_folder_view_get_folder(folder_view); if(folder) { g_signal_connect(folder, "fs-info", G_CALLBACK(on_folder_fs_info), page); // on_folder_fs_info(folder, win); fm_folder_query_filesystem_info(folder); } fm_side_pane_chdir(FM_SIDE_PANE(page->side_pane), path); /* destroy the page when the folder is unmounted or deleted. */ g_signal_connect_swapped(folder, "unmount", G_CALLBACK(gtk_widget_destroy), page); g_signal_connect_swapped(folder, "removed", G_CALLBACK(gtk_widget_destroy), page); g_signal_connect(folder, "content-changed", G_CALLBACK(on_folder_content_changed), page); g_signal_connect(folder, "fs-info", G_CALLBACK(on_folder_fs_info), page); /* tell the world that our current working directory is changed */ g_signal_emit(page, signals[CHDIR], 0, path); }
void fm_main_win_chdir_without_history(FmMainWin* win, FmPath* path) { fm_folder_view_chdir(FM_FOLDER_VIEW(win->folder_view), path); /* fm_nav_history_set_cur(); */ }
void on_create_new(GtkAction* action, FmMainWin* win) { FmFolderView* fv = FM_FOLDER_VIEW(win->folder_view); const char* name = gtk_action_get_name(action); GError* err = NULL; FmPath* cwd = fm_folder_view_get_cwd(fv); FmPath* dest; char* basename; _retry: basename = fm_get_user_input(GTK_WINDOW(win), _("Create New..."), _("Enter a name for the newly created file:"), _("New")); if(!basename) return; dest = fm_path_new_child(cwd, basename); g_free(basename); if( strcmp(name, "NewFolder") == 0 ) { GFile* gf = fm_path_to_gfile(dest); if(!g_file_make_directory(gf, NULL, &err)) { if(err->domain = G_IO_ERROR && err->code == G_IO_ERROR_EXISTS) { fm_path_unref(dest); g_error_free(err); g_object_unref(gf); err = NULL; goto _retry; } fm_show_error(GTK_WINDOW(win), err->message); g_error_free(err); } if(!err) /* select the newly created file */ { /*FIXME: this doesn't work since the newly created file will * only be shown after file-created event was fired on its * folder's monitor and after FmFolder handles it in idle * handler. So, we cannot select it since it's not yet in * the folder model now. */ /* fm_folder_view_select_file_path(fv, dest); */ } g_object_unref(gf); } else if( strcmp(name, "NewBlank") == 0 ) { GFile* gf = fm_path_to_gfile(dest); GFileOutputStream* f = g_file_create(gf, G_FILE_CREATE_NONE, NULL, &err); if(f) { g_output_stream_close(G_OUTPUT_STREAM(f), NULL, NULL); g_object_unref(f); } else { if(err->domain = G_IO_ERROR && err->code == G_IO_ERROR_EXISTS) { fm_path_unref(dest); g_error_free(err); g_object_unref(gf); err = NULL; goto _retry; } fm_show_error(GTK_WINDOW(win), err->message); g_error_free(err); } if(!err) /* select the newly created file */ { /*FIXME: this doesn't work since the newly created file will * only be shown after file-created event was fired on its * folder's monitor and after FmFolder handles it in idle * handler. So, we cannot select it since it's not yet in * the folder model now. */ /* fm_folder_view_select_file_path(fv, dest); */ } g_object_unref(gf); } else /* templates */ { } fm_path_unref(dest); }
static void on_entry_activate(GtkEntry* entry, FmMainWin* self) { fm_folder_view_chdir_by_name(FM_FOLDER_VIEW(self->folder_view), gtk_entry_get_text(entry)); }
void on_invert_select(GtkAction* act, FmMainWin* win) { fm_folder_view_select_invert(FM_FOLDER_VIEW(win->folder_view)); }
FmPath* fm_tab_page_get_cwd(FmTabPage* page) { return fm_folder_view_get_cwd(FM_FOLDER_VIEW(page->folder_view)); }
FmFolder* fm_tab_page_get_folder(FmTabPage* page) { return fm_folder_view_get_folder(FM_FOLDER_VIEW(page->folder_view)); }
void on_select_all(GtkAction* act, FmMainWin* win) { fm_folder_view_select_all(FM_FOLDER_VIEW(win->folder_view)); }
void fm_tab_page_reload(FmTabPage* page) { FmFolder* folder = fm_folder_view_get_folder(FM_FOLDER_VIEW(page->folder_view)); if(folder) fm_folder_reload(folder); }
void on_del(GtkAction* act, FmMainWin* win) { FmPathList* files = fm_folder_view_get_selected_file_paths(FM_FOLDER_VIEW(win->folder_view)); fm_trash_or_delete_files(files); fm_list_unref(files); }
static void fm_main_win_init(FmMainWin *self) { GtkWidget *vbox, *menubar, *toolitem, *next_btn, *scroll; GtkUIManager* ui; GtkActionGroup* act_grp; GtkAction* act; GtkAccelGroup* accel_grp; ++n_wins; vbox = gtk_vbox_new(FALSE, 0); self->hpaned = gtk_hpaned_new(); gtk_paned_set_position(GTK_PANED(self->hpaned), 150); /* places left pane */ self->places_view = fm_places_view_new(); scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(scroll), self->places_view); gtk_paned_add1(GTK_PANED(self->hpaned), scroll); /* folder view */ self->folder_view = fm_folder_view_new( FM_FV_ICON_VIEW ); fm_folder_view_set_show_hidden(FM_FOLDER_VIEW(self->folder_view), FALSE); fm_folder_view_sort(FM_FOLDER_VIEW(self->folder_view), GTK_SORT_DESCENDING, COL_FILE_NAME); fm_folder_view_set_selection_mode(FM_FOLDER_VIEW(self->folder_view), GTK_SELECTION_MULTIPLE); g_signal_connect(self->folder_view, "clicked", on_file_clicked, self); g_signal_connect(self->folder_view, "status", on_status, self); g_signal_connect(self->folder_view, "sel-changed", on_sel_changed, self); gtk_paned_add2(GTK_PANED(self->hpaned), self->folder_view); /* link places view with folder view. */ g_signal_connect_swapped(self->places_view, "chdir", G_CALLBACK(fm_main_win_chdir), self); /* create menu bar and toolbar */ ui = gtk_ui_manager_new(); act_grp = gtk_action_group_new("Main"); gtk_action_group_add_actions(act_grp, main_win_actions, G_N_ELEMENTS(main_win_actions), self); gtk_action_group_add_toggle_actions(act_grp, main_win_toggle_actions, G_N_ELEMENTS(main_win_toggle_actions), self); gtk_action_group_add_radio_actions(act_grp, main_win_mode_actions, G_N_ELEMENTS(main_win_mode_actions), FM_FV_ICON_VIEW, on_change_mode, self); gtk_action_group_add_radio_actions(act_grp, main_win_sort_type_actions, G_N_ELEMENTS(main_win_sort_type_actions), GTK_SORT_ASCENDING, on_sort_type, self); gtk_action_group_add_radio_actions(act_grp, main_win_sort_by_actions, G_N_ELEMENTS(main_win_sort_by_actions), 0, on_sort_by, self); accel_grp = gtk_ui_manager_get_accel_group(ui); gtk_window_add_accel_group(GTK_WINDOW(self), accel_grp); gtk_ui_manager_insert_action_group(ui, act_grp, 0); gtk_ui_manager_add_ui_from_string(ui, main_menu_xml, -1, NULL); menubar = gtk_ui_manager_get_widget(ui, "/menubar"); self->toolbar = gtk_ui_manager_get_widget(ui, "/toolbar"); /* FIXME: should make these optional */ gtk_toolbar_set_icon_size(GTK_TOOLBAR(self->toolbar), GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_toolbar_set_style(GTK_TOOLBAR(self->toolbar), GTK_TOOLBAR_ICONS); /* create 'Next' button manually and add a popup menu to it */ toolitem = g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, NULL); gtk_toolbar_insert(GTK_TOOLBAR(self->toolbar), toolitem, 2); gtk_widget_show(GTK_WIDGET(toolitem)); act = gtk_ui_manager_get_action(ui, "/menubar/GoMenu/Next"); gtk_activatable_set_related_action(GTK_ACTIVATABLE(toolitem), act); /* set up history menu */ self->nav_history = fm_nav_history_new(); self->history_menu = gtk_menu_new(); gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolitem), self->history_menu); g_signal_connect(toolitem, "show-menu", G_CALLBACK(on_show_history_menu), self); self->popup = gtk_ui_manager_get_widget(ui, "/popup"); gtk_box_pack_start( (GtkBox*)vbox, menubar, FALSE, TRUE, 0 ); gtk_box_pack_start( (GtkBox*)vbox, self->toolbar, FALSE, TRUE, 0 ); /* load bookmarks menu */ load_bookmarks(self, ui); /* the location bar */ self->location = fm_path_entry_new(); g_signal_connect(self->location, "activate", on_entry_activate, self); g_signal_connect(self->folder_view, "loaded", G_CALLBACK(on_view_loaded), (gpointer) self); toolitem = gtk_tool_item_new(); gtk_container_add( GTK_CONTAINER(toolitem), self->location ); gtk_tool_item_set_expand(GTK_TOOL_ITEM(toolitem), TRUE); gtk_toolbar_insert((GtkToolbar*)self->toolbar, toolitem, gtk_toolbar_get_n_items(GTK_TOOLBAR(self->toolbar)) - 1 ); gtk_box_pack_start( (GtkBox*)vbox, self->hpaned, TRUE, TRUE, 0 ); /* status bar */ self->statusbar = gtk_statusbar_new(); gtk_box_pack_start( (GtkBox*)vbox, self->statusbar, FALSE, TRUE, 0 ); self->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(self->statusbar), "status"); self->statusbar_ctx2 = gtk_statusbar_get_context_id(GTK_STATUSBAR(self->statusbar), "status2"); g_object_unref(act_grp); self->ui = ui; gtk_container_add( (GtkContainer*)self, vbox ); gtk_widget_show_all(vbox); fm_folder_view_set_show_hidden(FM_FOLDER_VIEW(self->folder_view), FALSE); fm_main_win_chdir(self, fm_path_get_home()); gtk_widget_grab_focus(self->folder_view); }
void on_show_hidden(GtkToggleAction* act, FmMainWin* win) { gboolean active = gtk_toggle_action_get_active(act); fm_folder_view_set_show_hidden( FM_FOLDER_VIEW(win->folder_view), active ); }
void on_change_mode(GtkRadioAction* act, GtkRadioAction *cur, FmMainWin* win) { int mode = gtk_radio_action_get_current_value(cur); fm_folder_view_set_mode( FM_FOLDER_VIEW(win->folder_view), mode ); }
void on_sort_type(GtkRadioAction* act, GtkRadioAction *cur, FmMainWin* win) { int val = gtk_radio_action_get_current_value(cur); fm_folder_view_sort(FM_FOLDER_VIEW(win->folder_view), val, -1); }
void on_go_up(GtkAction* act, FmMainWin* win) { FmPath* parent = fm_path_get_parent(fm_folder_view_get_cwd(FM_FOLDER_VIEW(win->folder_view))); if(parent) fm_main_win_chdir( win, parent); }