+/** @brief Return the file children of @p cn
+ *
+ * The list is terminated by a null pointer.
+ */
+static const char **dir_files(struct choosenode *cn, int *nfiles) {
+ const char **files = xcalloc(cn->children.nvec + 1, sizeof (char *));
+ int n, m;
+
+ for(n = m = 0; n < cn->children.nvec; ++n)
+ if(!(cn->children.vec[n]->flags & CN_EXPANDABLE))
+ files[m++] = cn->children.vec[n]->path;
+ files[m] = 0;
+ if(nfiles) *nfiles = m;
+ return files;
+}
+
+static void play_dir(struct choosenode *cn,
+ void attribute((unused)) *wfu) {
+ int ntracks, n;
+ const char **tracks = dir_files(cn, &ntracks);
+
+ gtk_label_set_text(GTK_LABEL(report_label), "adding track to queue");
+ for(n = 0; n < ntracks; ++n)
+ disorder_eclient_play(client, tracks[n], 0, 0);
+}
+
+static void properties_dir(struct choosenode *cn,
+ void attribute((unused)) *wfu) {
+ int ntracks;
+ const char **tracks = dir_files(cn, &ntracks);
+