--- a/gntfilesel.c Tue May 14 01:30:03 2019 -0400
+++ b/gntfilesel.c Tue May 14 05:26:20 2019 -0400
@@ -73,8 +73,6 @@
gboolean dirsonly; /* Show only directories */
GList *tags; /* List of tagged files when multiselect is set */
- gboolean (*read_fn)(const char *path, GList **files, GError **error);
@@ -191,46 +189,6 @@
-local_read_fn(const char *path, GList **files, GError **error)
- dir = g_dir_open(path, 0, error);
- if (dir == NULL || (error && *error)) {
- if (*path != '\0' && strcmp(path, G_DIR_SEPARATOR_S)) {
- file = gnt_file_new_dir("..");
- *files = g_list_prepend(*files, file);
- while ((str = g_dir_read_name(dir)) != NULL) {
- char *fp = g_build_filename(path, str, NULL);
- gnt_warning("Error stating location %s", fp);
- if (S_ISDIR(st.st_mode)) {
- file = gnt_file_new_dir(str);
- file = gnt_file_new(str, (long)st.st_size);
- *files = g_list_prepend(*files, file);
- *files = g_list_reverse(*files);
gnt_file_free(GntFile *file)
@@ -245,8 +203,8 @@
location_changed(GntFileSel *sel, GError **err)
GntFileSelPrivate *priv = gnt_file_sel_get_instance_private(sel);
@@ -268,50 +226,72 @@
- success = priv->read_fn(priv->current, &files, err);
- success = local_read_fn(priv->current, &files, err);
- if (!success || *err) {
+ dir = g_dir_open(priv->current, 0, err); + if (dir == NULL || *err) { gnt_warning("error opening location %s (%s)", priv->current,
*err ? (*err)->message : "reason unknown");
- for (iter = files; iter; iter = iter->next) {
- GntFile *file = iter->data;
- char *str = file->basename;
- if (file->type == GNT_FILE_DIR) {
- gnt_tree_add_row_after(
- GNT_TREE(priv->dirs), g_strdup(str),
- gnt_tree_create_row(GNT_TREE(priv->dirs), str),
- if (priv->multiselect && priv->dirsonly &&
- gnt_tree_set_row_flags(GNT_TREE(priv->dirs),
- } else if (!priv->dirsonly) {
- snprintf(size, sizeof(size), "%ld", file->size);
+ if (*priv->current != '\0' && + g_path_is_absolute(priv->current) && + *g_path_skip_root(priv->current) != '\0') { + gnt_tree_add_row_after( + GNT_TREE(priv->dirs), g_strdup(".."), + gnt_tree_create_row(GNT_TREE(priv->dirs), ".."), NULL, + if (priv->multiselect && priv->dirsonly && + is_tagged(sel, "..")) { + gnt_tree_set_row_flags(GNT_TREE(priv->dirs), "..", + while ((str = g_dir_read_name(dir)) != NULL) { + gchar *fp = g_build_filename(priv->current, str, NULL); + gnt_warning("Error stating location %s", fp); + /* Just there to silence const warnings; the key is + * suitably copied when necessary. */ + gchar *key = (gchar *)str; - gnt_tree_add_row_after(
- GNT_TREE(priv->files), g_strdup(str),
- gnt_tree_create_row(GNT_TREE(priv->files), str,
- if (priv->multiselect && is_tagged(sel, str)) {
- gnt_tree_set_row_flags(GNT_TREE(priv->files),
+ if (S_ISDIR(st.st_mode)) { + gnt_tree_add_row_after( + GNT_TREE(priv->dirs), g_strdup(str), + GNT_TREE(priv->dirs), key), + if (priv->multiselect && priv->dirsonly && + gnt_tree_set_row_flags( + GNT_TREE(priv->dirs), key, + g_snprintf(size, sizeof(size), "%ld", + gnt_tree_add_row_after( + GNT_TREE(priv->files), g_strdup(str), + GNT_TREE(priv->files), key, + if (priv->multiselect && is_tagged(sel, str)) { + gnt_tree_set_row_flags( + GNT_TREE(priv->files), key, - g_list_free_full(files, (GDestroyNotify)gnt_file_free);
if (gnt_widget_get_mapped(GNT_WIDGET(sel))) {
gnt_widget_draw(GNT_WIDGET(sel));
@@ -802,13 +782,3 @@
list = g_list_reverse(list);
-void gnt_file_sel_set_read_fn(GntFileSel *sel, gboolean (*read_fn)(const char *path, GList **files, GError **error))
- GntFileSelPrivate *priv = NULL;
- g_return_if_fail(GNT_IS_FILE_SEL(sel));
- priv = gnt_file_sel_get_instance_private(sel);
- priv->read_fn = read_fn;