From cf4bf344a985b96949ec09fbf5112fd4f658da85 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sat, 27 Aug 2016 21:48:55 -0400 Subject: [PATCH] add configuration option to toggle showing hidden files (default on), fixes issue #2769 --- audio/audio_dsp_filter.c | 2 +- config.def.h | 2 ++ configuration.c | 3 +++ configuration.h | 1 + cores/libretro-imageviewer/image_core.c | 2 +- gfx/drivers_context/drm_ctx.c | 2 +- gfx/video_filter.c | 2 +- intl/msg_hash_us.c | 8 +++++++ libretro-common/include/lists/dir_list.h | 9 ++++++-- libretro-common/lists/dir_list.c | 27 +++++++++++++++++++----- list_special.c | 4 +++- menu/menu_displaylist.c | 11 +++++++--- menu/menu_setting.c | 16 ++++++++++++++ msg_hash.h | 3 +++ retroarch.cfg | 3 +++ 15 files changed, 80 insertions(+), 15 deletions(-) diff --git a/audio/audio_dsp_filter.c b/audio/audio_dsp_filter.c index e837b39015..6a2abd1500 100644 --- a/audio/audio_dsp_filter.c +++ b/audio/audio_dsp_filter.c @@ -247,7 +247,7 @@ rarch_dsp_filter_t *rarch_dsp_filter_new( if (!frontend_driver_get_core_extension(ext_name, sizeof(ext_name))) goto error; - plugs = dir_list_new(basedir, ext_name, false, false, false); + plugs = dir_list_new(basedir, ext_name, false, true, false, false); if (!plugs) goto error; #endif diff --git a/config.def.h b/config.def.h index 410a1f7eb5..afae6bf19a 100644 --- a/config.def.h +++ b/config.def.h @@ -511,6 +511,8 @@ static unsigned aspect_ratio_idx = ASPECT_RATIO_CORE; /* Save configuration file on exit. */ static bool config_save_on_exit = true; +static bool show_hidden_files = true; + static const bool overlay_hide_in_menu = true; #ifdef HAVE_MENU diff --git a/configuration.c b/configuration.c index 12ab7de74d..13b3b3acde 100644 --- a/configuration.c +++ b/configuration.c @@ -965,6 +965,7 @@ static void config_set_defaults(void) g_defaults.path.config, sizeof(global->path.config)); settings->config_save_on_exit = config_save_on_exit; + settings->show_hidden_files = show_hidden_files; /* Avoid reloading config on every content load */ if (default_block_config_read) @@ -1314,6 +1315,7 @@ static bool config_load_file(const char *path, bool set_defaults, { "sort_savefiles_enable", &settings->sort_savefiles_enable}, { "sort_savestates_enable", &settings->sort_savestates_enable}, { "config_save_on_exit", &settings->config_save_on_exit}, + { "show_hidden_files", &settings->show_hidden_files}, #ifdef HAVE_MENU { "dpi_override_enable", &settings->menu.dpi.override_enable}, #endif @@ -2921,6 +2923,7 @@ int populate_settings_bool(settings_t *settings, struct config_bool_setting *out { "sort_savefiles_enable", settings->sort_savefiles_enable}, { "sort_savestates_enable", settings->sort_savestates_enable}, { "config_save_on_exit", settings->config_save_on_exit}, + { "show_hidden_files", settings->show_hidden_files}, { "input_autodetect_enable", settings->input.autodetect_enable}, { "audio_rate_control", settings->audio.rate_control} }; diff --git a/configuration.h b/configuration.h index a8729f807f..62592894b7 100644 --- a/configuration.h +++ b/configuration.h @@ -495,6 +495,7 @@ typedef struct settings #endif bool config_save_on_exit; + bool show_hidden_files; #ifdef HAVE_LAKKA bool ssh_enable; diff --git a/cores/libretro-imageviewer/image_core.c b/cores/libretro-imageviewer/image_core.c index 7033e6abec..8971c34ec0 100644 --- a/cores/libretro-imageviewer/image_core.c +++ b/cores/libretro-imageviewer/image_core.c @@ -240,7 +240,7 @@ bool IMAGE_CORE_PREFIX(retro_load_game)(const struct retro_game_info *info) path_basedir(dir); file_list = dir_list_new(dir, IMAGE_CORE_PREFIX(valid_extensions), - false,false,false); + false,true,false,false); dir_list_sort(file_list, false); free(dir); diff --git a/gfx/drivers_context/drm_ctx.c b/gfx/drivers_context/drm_ctx.c index 3878dfc387..cd86eeeea5 100644 --- a/gfx/drivers_context/drm_ctx.c +++ b/gfx/drivers_context/drm_ctx.c @@ -366,7 +366,7 @@ static void *gfx_ctx_drm_init(void *video_driver) return NULL; fd = -1; - gpu_descriptors = dir_list_new("/dev/dri", NULL, false, false, false); + gpu_descriptors = dir_list_new("/dev/dri", NULL, false, true, false, false); nextgpu: free_drm_resources(drm); diff --git a/gfx/video_filter.c b/gfx/video_filter.c index 98d13d82f2..c4b240386d 100644 --- a/gfx/video_filter.c +++ b/gfx/video_filter.c @@ -409,7 +409,7 @@ rarch_softfilter_t *rarch_softfilter_new(const char *filter_config, if (!frontend_driver_get_core_extension(ext_name, sizeof(ext_name))) goto error; - plugs = dir_list_new(basedir, ext_name, false, false, false); + plugs = dir_list_new(basedir, ext_name, false, false, false, false); if (!plugs) { diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 215c2be373..bcc110c24d 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -991,6 +991,10 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) #endif ); break; + case MENU_ENUM_LABEL_SHOW_HIDDEN_FILES: + snprintf(s, len, "Show hidden files\n" + "and folders."); + break; case MENU_ENUM_LABEL_VIDEO_SHADER_FILTER_PASS: snprintf(s, len, "Hardware filter for this pass. \n" @@ -2518,6 +2522,8 @@ static const char *menu_hash_to_str_us_label_enum(enum msg_hash_enums msg) return "auto_overrides_enable"; case MENU_ENUM_LABEL_CONFIG_SAVE_ON_EXIT: return "config_save_on_exit"; + case MENU_ENUM_LABEL_SHOW_HIDDEN_FILES: + return "show_hidden_files"; case MENU_ENUM_LABEL_VIDEO_SMOOTH: return "video_smooth"; case MENU_ENUM_LABEL_VIDEO_GAMMA: @@ -3841,6 +3847,8 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg) return "Load Override Files Automatically"; case MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT: return "Save Configuration On Exit"; + case MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES: + return "Show Hidden Files and Folders"; case MENU_ENUM_LABEL_VALUE_VIDEO_SMOOTH: return "HW Bilinear Filtering"; case MENU_ENUM_LABEL_VALUE_VIDEO_GAMMA: diff --git a/libretro-common/include/lists/dir_list.h b/libretro-common/include/lists/dir_list.h index 7ecba0bc40..a4d0d263ff 100644 --- a/libretro-common/include/lists/dir_list.h +++ b/libretro-common/include/lists/dir_list.h @@ -34,7 +34,9 @@ RETRO_BEGIN_DECLS * @dir : directory path. * @ext : allowed extensions of file directory entries to include. * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? * @include_compressed : include compressed files, even when not part of ext. + * @recursive : list directory contents recursively * * Create a directory listing. * @@ -42,7 +44,7 @@ RETRO_BEGIN_DECLS * NULL in case of error. Has to be freed manually. **/ struct string_list *dir_list_new(const char *dir, const char *ext, - bool include_dirs, bool include_compressed, bool recursive); + bool include_dirs, bool include_hidden, bool include_compressed, bool recursive); /** * dir_list_sort: @@ -69,13 +71,16 @@ void dir_list_free(struct string_list *list); * @list : the string list to add files to * @ext_list : the string list of extensions to include * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? * @include_compressed : Only include files which match ext. Do not try to match compressed files, etc. + * @recursive : list directory contents recursively * * Add files within a directory to an existing string list * * Returns: -1 on error, 0 on success. **/ -int dir_list_read(const char *dir, struct string_list *list, struct string_list *ext_list, bool include_dirs, bool include_compressed, bool recursive); +int dir_list_read(const char *dir, struct string_list *list, struct string_list *ext_list, + bool include_dirs, bool include_hidden, bool include_compressed, bool recursive); RETRO_END_DECLS diff --git a/libretro-common/lists/dir_list.c b/libretro-common/lists/dir_list.c index 3a32be9bac..2b71a6381c 100644 --- a/libretro-common/lists/dir_list.c +++ b/libretro-common/lists/dir_list.c @@ -151,7 +151,9 @@ static int parse_dir_entry(const char *name, char *file_path, * @dir : directory path. * @ext : allowed extensions of file directory entries to include. * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? * @include_compressed : Only include files which match ext. Do not try to match compressed files, etc. + * @recursive : list directory contents recursively * * Create a directory listing. * @@ -159,7 +161,7 @@ static int parse_dir_entry(const char *name, char *file_path, * NULL in case of error. Has to be freed manually. **/ struct string_list *dir_list_new(const char *dir, - const char *ext, bool include_dirs, bool include_compressed, bool recursive) + const char *ext, bool include_dirs, bool include_hidden, bool include_compressed, bool recursive) { struct string_list *ext_list = NULL; struct string_list *list = NULL; @@ -170,7 +172,7 @@ struct string_list *dir_list_new(const char *dir, if (ext) ext_list = string_split(ext, "|"); - if(dir_list_read(dir, list, ext_list, include_dirs, include_compressed, recursive) == -1) { + if(dir_list_read(dir, list, ext_list, include_dirs, include_hidden, include_compressed, recursive) == -1) { string_list_free(list); string_list_free(ext_list); return NULL; @@ -186,13 +188,15 @@ struct string_list *dir_list_new(const char *dir, * @list : the string list to add files to * @ext_list : the string list of extensions to include * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? * @include_compressed : Only include files which match ext. Do not try to match compressed files, etc. + * @recursive : list directory contents recursively * * Add files within a directory to an existing string list * * Returns: -1 on error, 0 on success. **/ -int dir_list_read(const char *dir, struct string_list *list, struct string_list *ext_list, bool include_dirs, bool include_compressed, bool recursive) +int dir_list_read(const char *dir, struct string_list *list, struct string_list *ext_list, bool include_dirs, bool include_hidden, bool include_compressed, bool recursive) { struct RDIR *entry = retro_opendir(dir); @@ -205,6 +209,13 @@ int dir_list_read(const char *dir, struct string_list *list, struct string_list return -1; } +#ifdef _WIN32 + if (include_hidden) + entry.dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; + else + entry.dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN; +#endif + while (retro_readdir(entry)) { bool is_dir = false; @@ -216,11 +227,17 @@ int dir_list_read(const char *dir, struct string_list *list, struct string_list fill_pathname_join(file_path, dir, name, sizeof(file_path)); is_dir = retro_dirent_is_dir(entry, file_path); + if (!include_hidden) + { + if (*name == '.') + continue; + } + if(is_dir && recursive) { - if(strncmp(name, ".", 1) == 0 || strncmp(name, "..", 2) == 0) + if(strstr(name, ".") || strstr(name, "..")) continue; - dir_list_read(file_path, list, ext_list, include_dirs, include_compressed, recursive); + dir_list_read(file_path, list, ext_list, include_dirs, include_hidden, include_compressed, recursive); } ret = parse_dir_entry(name, file_path, is_dir, diff --git a/list_special.c b/list_special.c index bfac49b46e..463df5f37d 100644 --- a/list_special.c +++ b/list_special.c @@ -44,6 +44,7 @@ #include "audio/audio_driver.h" #include "audio/audio_resampler_driver.h" #include "record/record_driver.h" +#include "configuration.h" struct string_list *dir_list_new_special(const char *input_dir, enum dir_list_type type, const char *filter) @@ -54,6 +55,7 @@ struct string_list *dir_list_new_special(const char *input_dir, const char *exts = NULL; bool include_dirs = false; bool recursive = false; + settings_t *settings = config_get_ptr(); (void)input_dir; @@ -135,7 +137,7 @@ struct string_list *dir_list_new_special(const char *input_dir, return NULL; } - return dir_list_new(dir, exts, include_dirs, type == DIR_LIST_CORE_INFO, recursive); + return dir_list_new(dir, exts, include_dirs, settings->show_hidden_files, type == DIR_LIST_CORE_INFO, recursive); } struct string_list *string_list_new_special(enum string_list_type type, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 83c11a964d..32e47061c3 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3165,6 +3165,7 @@ static int menu_displaylist_parse_playlists( size_t i, list_size; struct string_list *str_list = NULL; unsigned items_found = 0; + settings_t *settings = config_get_ptr(); if (!*info->path) { @@ -3174,7 +3175,7 @@ static int menu_displaylist_parse_playlists( return 0; } - str_list = dir_list_new(info->path, NULL, true, true, false); + str_list = dir_list_new(info->path, NULL, true, settings->show_hidden_files, true, false); if (!str_list) { @@ -3272,6 +3273,7 @@ static int menu_displaylist_parse_cores( bool filter_ext = true; struct string_list *str_list = NULL; unsigned items_found = 0; + settings_t *settings = config_get_ptr(); if (!*info->path) { @@ -3283,7 +3285,7 @@ static int menu_displaylist_parse_cores( str_list = dir_list_new(info->path, filter_ext ? info->exts : NULL, - true, true, false); + true, settings->show_hidden_files, true, false); { char out_dir[PATH_MAX_LENGTH] = {0}; @@ -3489,7 +3491,7 @@ static int menu_displaylist_parse_generic( else str_list = dir_list_new(info->path, filter_ext ? info->exts : NULL, - true, true, false); + true, settings->show_hidden_files, true, false); #ifdef HAVE_LIBRETRODB if (BIT32_GET(filebrowser_types, FILEBROWSER_SCAN_DIR)) @@ -4474,6 +4476,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE, PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_SHOW_HIDDEN_FILES, + PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 658077118d..fe1b3bd361 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -4711,6 +4711,22 @@ static bool setting_append_list( SD_FLAG_NONE); menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_CONFIG_SAVE_ON_EXIT); + CONFIG_BOOL( + list, list_info, + &settings->show_hidden_files, + msg_hash_to_str(MENU_ENUM_LABEL_SHOW_HIDDEN_FILES), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES), + show_hidden_files, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ON), + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_SHOW_HIDDEN_FILES); + CONFIG_BOOL( list, list_info, &settings->game_specific_options, diff --git a/msg_hash.h b/msg_hash.h index b7a131d01a..ddce2844f0 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1147,6 +1147,9 @@ enum msg_hash_enums MENU_ENUM_LABEL_CONFIG_SAVE_ON_EXIT, MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, + MENU_ENUM_LABEL_SHOW_HIDDEN_FILES, + MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES, + /* Driver settings */ MENU_ENUM_LABEL_AUDIO_DRIVER, diff --git a/retroarch.cfg b/retroarch.cfg index f3140707db..f03e81c55f 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -122,6 +122,9 @@ # Load up a specific config file based on the core being used. # core_specific_config = false +# Shows hidden files and folders in directory listings. +# show_hidden_files = true + #### Video # Video driver to use. "gl", "xvideo", "sdl"