Exemple #1
0
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;
}
Exemple #2
0
/* 
 * 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;
}
Exemple #3
0
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);
}