aboutsummaryrefslogtreecommitdiffstats
path: root/src/mpdclient.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mpdclient.c')
-rw-r--r--src/mpdclient.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/mpdclient.c b/src/mpdclient.c
index 88330b2a9..b13146f38 100644
--- a/src/mpdclient.c
+++ b/src/mpdclient.c
@@ -42,6 +42,31 @@
/* from utils.c */
extern GList *string_list_free(GList *string_list);
+
+/* filelist sorting functions */
+static gint
+compare_filelistentry_dir(gconstpointer filelist_entry1, gconstpointer filelist_entry2)
+{
+ mpd_InfoEntity *e1, *e2;
+ char *key1, *key2;
+ int n = 0;
+
+ e1 = ((filelist_entry_t *)filelist_entry1)->entity;
+ e2 = ((filelist_entry_t *)filelist_entry2)->entity;
+ if (e1 && e2 &&
+ e1->type == MPD_INFO_ENTITY_TYPE_DIRECTORY &&
+ e2->type == MPD_INFO_ENTITY_TYPE_DIRECTORY)
+ {
+ key1 = g_utf8_collate_key(e1->info.directory->path,-1);
+ key2 = g_utf8_collate_key(e2->info.directory->path,-1);
+ n = strcmp(key1,key2);
+ g_free(key1);
+ g_free(key2);
+ }
+ return n;
+}
+
+
/* Error callbacks */
static gint
error_cb(mpdclient_t *c, gint error, gchar *msg)
@@ -853,6 +878,7 @@ mpdclient_filelist_get(mpdclient_t *c, gchar *path)
mpdclient_filelist_t *filelist;
mpd_InfoEntity *entity;
gchar *path_utf8 = locale_to_utf8(path);
+ gboolean has_dirs_only = TRUE;
D("mpdclient_filelist_get(%s)\n", path);
mpd_sendLsInfoCommand(c->connection, path_utf8);
@@ -873,6 +899,11 @@ mpdclient_filelist_get(mpdclient_t *c, gchar *path)
entry->entity = entity;
filelist->list = g_list_append(filelist->list, (gpointer) entry);
filelist->length++;
+
+ if (has_dirs_only && entity->type != MPD_INFO_ENTITY_TYPE_DIRECTORY)
+ {
+ has_dirs_only = FALSE;
+ }
}
/* If there's an error, ignore it. We'll return an empty filelist. */
@@ -882,6 +913,13 @@ mpdclient_filelist_get(mpdclient_t *c, gchar *path)
filelist->path = g_strdup(path);
filelist->updated = TRUE;
+ // If there are only directory entities in the filelist, we sort it
+ if (has_dirs_only)
+ {
+ D("mpdclient_filelist_get: only dirs; sorting!\n");
+ filelist->list = g_list_sort(filelist->list, compare_filelistentry_dir);
+ }
+
return filelist;
}