GEList *fl_get_selected_files() { GEList *result = g_elist_new(); GtkTreeSelection *sel; GtkTreeModel *model; GList *selected_rows; GList *node; sel = gtk_tree_view_get_selection(tv_files); selected_rows = gtk_tree_selection_get_selected_rows(sel, &model); for (node = selected_rows; node; node = node->next) { GtkTreeIter iter; char *path; gtk_tree_model_get_iter(model, &iter, node->data); gtk_tree_model_get(model, &iter, 4, &path, -1); g_elist_append(result, path); } g_list_foreach(selected_rows, (GFunc)gtk_tree_path_free, NULL); g_list_free(selected_rows); return result; }
/* * Scans a directory for files matching a pattern and returns them in an GEList * * <dir_stack> If not NULL, will be used to store the names of subdirectories * found (not subject to matching) * <dir_memory> If not NULL, will be used to remember visited dirs. This * guarantees that each dir is only visited once. * ALWAYS USE THIS PARAMETER WHEN DOING RECURSIVE SCANS! * <base_dir> Directory to scan * <patterns> NULL terminated array of glob pattern strings * <sort> If TRUE the result will be sorted * * return GEList with matching files. File names will be prefixed with * the <base_dir>, unless it is "." * This list should be freed with g_elist_free_data(). */ static GEList *aux_file_list( GEList *dir_stack, GHashTable *dir_memory, const gchar *base_dir, const gchar **patterns, gboolean sort ) { GEList *result; GEList *aux_stack = NULL; DIR* dir; int dir_fd; struct stat dir_stat; struct dirent *dir_entry; struct stat stat_data; gint res; gchar *buffer; gchar *buffer_fname; gint buffer_size; gboolean matched; gint i; result = g_elist_new(); if (dir_stack != NULL) aux_stack = g_elist_new(); dir = opendir(base_dir); if (dir == NULL) { g_warning("couldn't open dir: %s", base_dir); return result; } /* guard against loops in the directory structure */ if (dir_memory != NULL) { dir_fd = dirfd(dir); if (dir_fd >= 0) fstat(dir_fd, &dir_stat); else stat(base_dir, &dir_stat); if (remember_dir(dir_memory, &dir_stat)) { //printf("skipping directory, already been here: %s", base_dir); closedir(dir); return result; } } // XXX - fixed size buffer buffer = g_malloc(buffer_size = 1024); if (strcmp(base_dir, ".") == 0) { buffer_fname = buffer; } else { buffer_fname = memccpy(buffer, base_dir, 0, buffer_size); if (buffer_fname == NULL) { g_warning("FIXME - buffer too small for file name!!!"); closedir(dir); g_free(buffer); return result; } else { *(buffer_fname-1) = '/'; buffer_size -= (gint)(buffer_fname - buffer); } } while ( (dir_entry = readdir(dir)) ) { if (memccpy(buffer_fname, dir_entry->d_name, 0, buffer_size) == NULL) { g_warning("FIXME - buffer too small for file name!!!"); continue; } res = stat(buffer, &stat_data); if (res < 0) { //printf("couldn't stat file: %s", buffer); continue; } if (S_ISDIR(stat_data.st_mode)) { if ((aux_stack != NULL) && (strcmp(dir_entry->d_name, ".") != 0) && (strcmp(dir_entry->d_name, "..") != 0)) { g_elist_push(aux_stack, g_strdup(buffer)); } continue; } if (patterns == NULL) { matched = TRUE; } else { matched = FALSE; for (i = 0; patterns[i]; i++) { if (fnmatch(patterns[i], dir_entry->d_name, FNM_NOESCAPE) == 0) { matched = TRUE; break; } } } if (matched) g_elist_append(result, g_strdup(buffer)); } if (sort) { g_elist_sort(result, (GCompareFunc)strcoll); if (aux_stack != NULL) g_elist_sort(aux_stack, rev_strcoll); } if (aux_stack != NULL) g_elist_concat(dir_stack, aux_stack); closedir(dir); g_free(buffer); return result; }
void fl_init(GtkBuilder *builder) { GEList *dir_list; /* * get the widgets from glade */ w_main = GTK_WINDOW(gtk_builder_get_object(builder, "w_main")); combo_wd = GTK_COMBO_BOX_TEXT(gtk_builder_get_object(builder, "combo_wd")); ent_wd = GTK_ENTRY(gtk_builder_get_object(builder, "ent_wd")); cb_recurse = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "cb_recurse")); tv_files = GTK_TREE_VIEW(gtk_builder_get_object(builder, "tv_files")); lab_file_count = GTK_LABEL(gtk_builder_get_object(builder, "lab_file_count")); menu_file_list = GTK_MENU(gtk_builder_get_object(builder, "menu_file_list")); m_ctx_manual_rename = GTK_MENU_ITEM(gtk_builder_get_object(builder, "m_ctx_manual_rename")); m_ctx_delete = GTK_MENU_ITEM(gtk_builder_get_object(builder, "m_ctx_delete")); m_ctx_unselect_all = GTK_MENU_ITEM(gtk_builder_get_object(builder, "m_ctx_unselect_all")); l_help_title = GTK_LABEL(gtk_builder_get_object(builder, "l_help_title")); l_help_secondary = GTK_LABEL(gtk_builder_get_object(builder, "l_help_secondary")); /* * create the file chooser */ dlg_wd_select = GTK_DIALOG(gtk_file_chooser_dialog_new( _("Select Directory"), w_main, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, "Cancel", GTK_RESPONSE_CANCEL, "Open", GTK_RESPONSE_ACCEPT, NULL)); /* * load file list icons */ pix_file = gdk_pixbuf_new_from_file(DATADIR"/file.png", NULL); pix_folder = gdk_pixbuf_new_from_file(DATADIR"/folder.png", NULL); /* * setup the file list treeview */ setup_tree_view(); g_signal_connect(gtk_tree_view_get_selection(tv_files), "changed", G_CALLBACK(cb_file_selection_changed), NULL); gtk_tree_selection_set_select_function(gtk_tree_view_get_selection(tv_files), cb_file_selection_changing, NULL, NULL); /* * get the preference values, or set them to defaults */ /* recurse */ recurse = pref_get_ref("ds:recurse"); if (!recurse) { gboolean temp = FALSE; recurse = pref_set("ds:recurse", PREF_BOOLEAN, &temp); } gtk_toggle_button_set_active(cb_recurse, *recurse); /* dir_mru */ dir_list = pref_get_ref("ds:dir_mru"); if (!dir_list) { GEList *temp_list = g_elist_new(); g_elist_append(temp_list, (void*)g_get_home_dir()); dir_list = pref_set("ds:dir_mru", PREF_STRING | PREF_LIST, temp_list); g_elist_free_data(temp_list); } dir_mru = mru_new_from_list(10, dir_list); }