summaryrefslogtreecommitdiff
path: root/apps/filetree.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/filetree.c')
-rw-r--r--apps/filetree.c68
1 files changed, 35 insertions, 33 deletions
diff --git a/apps/filetree.c b/apps/filetree.c
index b5f5dece5a..594a0bd6f1 100644
--- a/apps/filetree.c
+++ b/apps/filetree.c
@@ -224,7 +224,11 @@ static int compare(const void* p1, const void* p2)
224 struct entry* e2 = (struct entry*)p2; 224 struct entry* e2 = (struct entry*)p2;
225 int criteria; 225 int criteria;
226 226
227 if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY) 227 if (cmp_data.sort_dir == SORT_AS_FILE)
228 { /* treat as two files */
229 criteria = global_settings.sort_file;
230 }
231 else if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY)
228 { /* two directories */ 232 { /* two directories */
229 criteria = cmp_data.sort_dir; 233 criteria = cmp_data.sort_dir;
230 234
@@ -326,18 +330,17 @@ int ft_load(struct tree_context* c, const char* tempdir)
326 info = dir_get_info(dir, entry); 330 info = dir_get_info(dir, entry);
327 len = strlen((char *)entry->d_name); 331 len = strlen((char *)entry->d_name);
328 332
329 /* skip directories . and .. */
330 if ((info.attribute & ATTR_DIRECTORY) &&
331 (((len == 1) && (!strncmp((char *)entry->d_name, ".", 1))) ||
332 ((len == 2) && (!strncmp((char *)entry->d_name, "..", 2))))) {
333 continue;
334 }
335
336 /* Skip FAT volume ID */ 333 /* Skip FAT volume ID */
337 if (info.attribute & ATTR_VOLUME_ID) { 334 if (info.attribute & ATTR_VOLUME_ID) {
338 continue; 335 continue;
339 } 336 }
340 337
338 dptr->attr = info.attribute;
339 int dir_attr = (dptr->attr & ATTR_DIRECTORY);
340 /* skip directories . and .. */
341 if (dir_attr && is_dotdir_name(entry->d_name))
342 continue;
343
341 /* filter out dotfiles and hidden files */ 344 /* filter out dotfiles and hidden files */
342 if (*c->dirfilter != SHOW_ALL && 345 if (*c->dirfilter != SHOW_ALL &&
343 ((entry->d_name[0]=='.') || 346 ((entry->d_name[0]=='.') ||
@@ -345,48 +348,45 @@ int ft_load(struct tree_context* c, const char* tempdir)
345 continue; 348 continue;
346 } 349 }
347 350
348 dptr->attr = info.attribute;
349 int dir_attr = (dptr->attr & ATTR_DIRECTORY);
350
351 /* check for known file types */ 351 /* check for known file types */
352 if ( !(dir_attr) ) 352 if ( !(dir_attr) )
353 dptr->attr |= filetype_get_attr((char *)entry->d_name); 353 dptr->attr |= filetype_get_attr((char *)entry->d_name);
354 354
355 int file_attr = (dptr->attr & FILE_ATTR_MASK); 355 int file_attr = (dptr->attr & FILE_ATTR_MASK);
356 356
357#define CHK_FT(show,attr) (*c->dirfilter == (show) && file_attr != (attr))
357 /* filter out non-visible files */ 358 /* filter out non-visible files */
358 if ((!(dir_attr) && ((*c->dirfilter == SHOW_PLAYLIST && 359 if ((!(dir_attr) && (CHK_FT(SHOW_PLAYLIST, FILE_ATTR_M3U) ||
359 file_attr != FILE_ATTR_M3U) || 360 (CHK_FT(SHOW_MUSIC, FILE_ATTR_AUDIO) && file_attr != FILE_ATTR_M3U) ||
360 ((*c->dirfilter == SHOW_MUSIC && file_attr != FILE_ATTR_AUDIO) &&
361 file_attr != FILE_ATTR_M3U) ||
362 (*c->dirfilter == SHOW_SUPPORTED && !filetype_supported(dptr->attr)))) || 361 (*c->dirfilter == SHOW_SUPPORTED && !filetype_supported(dptr->attr)))) ||
363 (*c->dirfilter == SHOW_WPS && file_attr != FILE_ATTR_WPS) || 362 CHK_FT(SHOW_WPS, FILE_ATTR_WPS) ||
364 (*c->dirfilter == SHOW_FONT && file_attr != FILE_ATTR_FONT) || 363 CHK_FT(SHOW_FONT, FILE_ATTR_FONT) ||
365 (*c->dirfilter == SHOW_SBS && file_attr != FILE_ATTR_SBS) || 364 CHK_FT(SHOW_SBS, FILE_ATTR_SBS) ||
366#if CONFIG_TUNER 365#if CONFIG_TUNER
367 (*c->dirfilter == SHOW_FMS && file_attr != FILE_ATTR_FMS) || 366 CHK_FT(SHOW_FMS, FILE_ATTR_FMS) ||
367 CHK_FT(SHOW_FMR, FILE_ATTR_FMR) ||
368#endif 368#endif
369#ifdef HAVE_REMOTE_LCD 369#ifdef HAVE_REMOTE_LCD
370 (*c->dirfilter == SHOW_RWPS && file_attr != FILE_ATTR_RWPS) || 370 CHK_FT(SHOW_RWPS, FILE_ATTR_RWPS) ||
371 (*c->dirfilter == SHOW_RSBS && file_attr != FILE_ATTR_RSBS) || 371 CHK_FT(SHOW_RSBS, FILE_ATTR_RSBS) ||
372#if CONFIG_TUNER 372#if CONFIG_TUNER
373 (*c->dirfilter == SHOW_RFMS && file_attr != FILE_ATTR_RFMS) || 373 CHK_FT(SHOW_RFMS, FILE_ATTR_RFMS) ||
374#endif
375#endif 374#endif
376#if CONFIG_TUNER
377 (*c->dirfilter == SHOW_FMR && file_attr != FILE_ATTR_FMR) ||
378#endif 375#endif
379 (*c->dirfilter == SHOW_M3U && file_attr != FILE_ATTR_M3U) || 376 CHK_FT(SHOW_M3U, FILE_ATTR_M3U) ||
380 (*c->dirfilter == SHOW_CFG && file_attr != FILE_ATTR_CFG) || 377 CHK_FT(SHOW_CFG, FILE_ATTR_CFG) ||
381 (*c->dirfilter == SHOW_LNG && file_attr != FILE_ATTR_LNG) || 378 CHK_FT(SHOW_LNG, FILE_ATTR_LNG) ||
382 (*c->dirfilter == SHOW_MOD && file_attr != FILE_ATTR_MOD) || 379 CHK_FT(SHOW_MOD, FILE_ATTR_MOD) ||
383 (*c->dirfilter == SHOW_PLUGINS && file_attr != FILE_ATTR_ROCK && 380 /* show first level directories */
384 file_attr != FILE_ATTR_LUA && 381 ((!(dir_attr) || c->dirlevel > 0) &&
385 file_attr != FILE_ATTR_OPX) || 382 CHK_FT(SHOW_PLUGINS, FILE_ATTR_ROCK) &&
383 file_attr != FILE_ATTR_LUA &&
384 file_attr != FILE_ATTR_OPX) ||
386 (callback_show_item && !callback_show_item(entry->d_name, dptr->attr, c))) 385 (callback_show_item && !callback_show_item(entry->d_name, dptr->attr, c)))
387 { 386 {
388 continue; 387 continue;
389 } 388 }
389#undef CHK_FT
390 390
391 if (len > c->cache.name_buffer_size - name_buffer_used - 1) { 391 if (len > c->cache.name_buffer_size - name_buffer_used - 1) {
392 /* Tell the world that we ran out of buffer space */ 392 /* Tell the world that we ran out of buffer space */
@@ -408,7 +408,9 @@ int ft_load(struct tree_context* c, const char* tempdir)
408 c->dirlength = files_in_dir; 408 c->dirlength = files_in_dir;
409 closedir(dir); 409 closedir(dir);
410 410
411 cmp_data.sort_dir = c->sort_dir; 411 /* allow directories to be sorted into file list */
412 cmp_data.sort_dir = (*c->dirfilter == SHOW_PLUGINS) ? SORT_AS_FILE : c->sort_dir;
413
412 if (global_settings.sort_case) 414 if (global_settings.sort_case)
413 { 415 {
414 if (global_settings.interpret_numbers == SORT_INTERPRET_AS_NUMBER) 416 if (global_settings.interpret_numbers == SORT_INTERPRET_AS_NUMBER)