From c5072b64779fc606d1b8682f26be5fe2fa35e337 Mon Sep 17 00:00:00 2001 From: jdgleaver Date: Tue, 1 Sep 2020 13:41:10 +0100 Subject: [PATCH] Use last selected shader preset directory when changing shaders via previous/next hotkeys --- retroarch.c | 214 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 135 insertions(+), 79 deletions(-) diff --git a/retroarch.c b/retroarch.c index 42df754e6a..fd590de87d 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1579,10 +1579,13 @@ typedef struct bool set; } runloop_core_status_msg_t; -struct rarch_dir_list +struct rarch_dir_shader_list { - struct string_list *list; - size_t ptr; + struct string_list *shader_list; + char *directory; + size_t selection; + bool shader_loaded; + bool remember_last_preset_dir; }; #ifdef HAVE_BSV_MOVIE @@ -2149,7 +2152,7 @@ struct rarch_state retro_keyboard_event_t runloop_key_event; /* ptr alignment */ retro_keyboard_event_t runloop_frontend_key_event; /* ptr alignment */ video_driver_frame_t frame_bak; /* ptr alignment */ - struct rarch_dir_list dir_shader_list; /* ptr alignment */ + struct rarch_dir_shader_list dir_shader_list; /* ptr alignment */ #ifdef HAVE_RUNAHEAD function_t retro_reset_callback_original; /* ptr alignment */ function_t original_retro_deinit; /* ptr alignment */ @@ -11673,35 +11676,49 @@ static void path_deinit_subsystem(struct rarch_state *p_rarch) p_rarch->subsystem_fullpaths = NULL; } -static bool dir_free_shader(struct rarch_state *p_rarch) +static void dir_free_shader(struct rarch_state *p_rarch) { - struct rarch_dir_list *dir_list = - (struct rarch_dir_list*)&p_rarch->dir_shader_list; + struct rarch_dir_shader_list *dir_list = + (struct rarch_dir_shader_list*)&p_rarch->dir_shader_list; + settings_t *settings = p_rarch->configuration_settings; + bool shader_remember_last_dir = settings->bools.video_shader_remember_last_dir; - dir_list_free(dir_list->list); - dir_list->list = NULL; - dir_list->ptr = 0; + if (dir_list->shader_list) + { + dir_list_free(dir_list->shader_list); + dir_list->shader_list = NULL; + } - return true; + if (dir_list->directory) + { + free(dir_list->directory); + dir_list->directory = NULL; + } + + dir_list->selection = 0; + dir_list->shader_loaded = false; + dir_list->remember_last_preset_dir = shader_remember_last_dir; } - -#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) -static bool dir_init_shader( +static bool dir_init_shader_internal( struct rarch_state *p_rarch, const char *path_dir_shader, bool show_hidden_files) { - unsigned i; - struct rarch_dir_list *dir_list = NULL; - struct string_list *new_list = dir_list_new_special(path_dir_shader, - DIR_LIST_SHADERS, NULL, show_hidden_files); + struct rarch_dir_shader_list *dir_list = (struct rarch_dir_shader_list*) + &p_rarch->dir_shader_list; + struct string_list *new_list = dir_list_new_special( + path_dir_shader, DIR_LIST_SHADERS, NULL, show_hidden_files); + settings_t *settings = p_rarch->configuration_settings; + bool shader_remember_last_dir = settings->bools.video_shader_remember_last_dir; + size_t i; if (!new_list) return false; - if (new_list->size == 0) + + if (new_list->size < 1) { - string_list_free(new_list); + dir_list_free(new_list); return false; } @@ -11712,20 +11729,75 @@ static bool dir_init_shader( msg_hash_to_str(MSG_FOUND_SHADER), new_list->elems[i].data); - dir_list = (struct rarch_dir_list*)&p_rarch->dir_shader_list; - dir_list->list = new_list; - dir_list->ptr = 0; + dir_list->shader_list = new_list; + dir_list->directory = strdup(path_dir_shader); + dir_list->selection = 0; + dir_list->shader_loaded = false; + dir_list->remember_last_preset_dir = shader_remember_last_dir; return true; } + +static void dir_init_shader(struct rarch_state *p_rarch) +{ +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) + settings_t *settings = p_rarch->configuration_settings; + bool show_hidden_files = settings->bools.show_hidden_files; + bool shader_remember_last_dir = settings->bools.video_shader_remember_last_dir; + const char *directory_video_shader = settings->paths.directory_video_shader; + const char *directory_menu_config = settings->paths.directory_menu_config; + enum rarch_shader_type last_shader_preset_type = menu_driver_get_last_shader_preset_type(); + const char *last_shader_preset_dir = menu_driver_get_last_shader_preset_dir(); + + /* Always free existing shader list */ + dir_free_shader(p_rarch); + + /* Try directory of last selected shader preset */ + if (shader_remember_last_dir && + (last_shader_preset_type != RARCH_SHADER_NONE) && + !string_is_empty(last_shader_preset_dir) && + dir_init_shader_internal( + p_rarch, last_shader_preset_dir, show_hidden_files)) + return; + + /* Try video shaders directory */ + if (!string_is_empty(directory_video_shader) && + dir_init_shader_internal( + p_rarch, directory_video_shader, show_hidden_files)) + return; + + /* Try config directory */ + if (!string_is_empty(directory_menu_config) && + dir_init_shader_internal( + p_rarch, directory_menu_config, show_hidden_files)) + return; + + /* Try 'top level' directory containing main + * RetroArch config file */ + if (!path_is_empty(RARCH_PATH_CONFIG)) + { + char *rarch_config_directory = strdup(path_get(RARCH_PATH_CONFIG)); + path_basedir(rarch_config_directory); + + if (!string_is_empty(rarch_config_directory)) + dir_init_shader_internal( + p_rarch, rarch_config_directory, show_hidden_files); + + free(rarch_config_directory); + } +#else + /* If shaders are unsupported, just ensure that + * shader list is empty */ + dir_free_shader(p_rarch); #endif +} /* check functions */ /** * dir_check_shader: - * @pressed_next : was next shader key pressed? - * @pressed_previous : was previous shader key pressed? + * @pressed_next : Was next shader key pressed? + * @pressed_prev : Was previous shader key pressed? * * Checks if any one of the shader keys has been pressed for this frame: * a) Next shader index. @@ -11733,35 +11805,59 @@ static bool dir_init_shader( * * Will also immediately apply the shader. **/ -static void dir_check_shader( - struct rarch_state *p_rarch, +static void dir_check_shader(struct rarch_state *p_rarch, bool pressed_next, bool pressed_prev) { - static bool change_triggered = false; - struct rarch_dir_list *dir_list = (struct rarch_dir_list*) - &p_rarch->dir_shader_list; +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) + struct rarch_dir_shader_list *dir_list = (struct rarch_dir_shader_list*) + &p_rarch->dir_shader_list; + settings_t *settings = p_rarch->configuration_settings; + bool shader_remember_last_dir = settings->bools.video_shader_remember_last_dir; + enum rarch_shader_type last_shader_preset_type = menu_driver_get_last_shader_preset_type(); + const char *last_shader_preset_dir = menu_driver_get_last_shader_preset_dir(); - if (!dir_list || !dir_list->list) + /* Check whether shader list needs to be + * (re)initialised */ + if (!dir_list->shader_list || + (dir_list->remember_last_preset_dir != shader_remember_last_dir) || + (shader_remember_last_dir && + (last_shader_preset_type != RARCH_SHADER_NONE) && + !string_is_equal(dir_list->directory, last_shader_preset_dir))) + dir_init_shader(p_rarch); + + if (!dir_list->shader_list || + (dir_list->shader_list->size < 1)) return; + /* Select next shader in list */ if (pressed_next) { - if (change_triggered) - dir_list->ptr = (dir_list->ptr + 1) % - dir_list->list->size; + /* Only increment selection if a shader + * from this list has already been loaded + * (otherwise first entry in the list may + * be skipped) */ + if (dir_list->shader_loaded) + { + if (dir_list->selection < dir_list->shader_list->size - 1) + dir_list->selection++; + else + dir_list->selection = 0; + } } + /* Select previous shader in list */ else if (pressed_prev) { - if (dir_list->ptr == 0) - dir_list->ptr = dir_list->list->size - 1; + if (dir_list->selection > 0) + dir_list->selection--; else - dir_list->ptr--; + dir_list->selection = dir_list->shader_list->size - 1; } else return; - change_triggered = true; - command_set_shader(dir_list->list->elems[dir_list->ptr].data); + command_set_shader(dir_list->shader_list->elems[dir_list->selection].data); + dir_list->shader_loaded = true; +#endif } /* get size functions */ @@ -31765,46 +31861,6 @@ static bool video_driver_init_internal(bool *video_is_threaded) if ((enum rotation)settings->uints.screen_orientation != ORIENTATION_NORMAL) video_display_server_set_screen_orientation((enum rotation)settings->uints.screen_orientation); - dir_free_shader(p_rarch); - -#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) - { - bool dir_list_is_free = true; - bool show_hidden_files = settings->bools.show_hidden_files; - const char *directory_video_shader = settings->paths.directory_video_shader; - const char *directory_menu_config = settings->paths.directory_menu_config; - - if (!string_is_empty(directory_video_shader)) - dir_list_is_free = !dir_init_shader( - p_rarch, - directory_video_shader, - show_hidden_files); - - if (dir_list_is_free && - !string_is_empty(directory_menu_config)) - dir_list_is_free = !dir_init_shader( - p_rarch, - directory_menu_config, - show_hidden_files); - - if (dir_list_is_free && - !path_is_empty(RARCH_PATH_CONFIG)) - { - char *config_file_directory = strdup(path_get(RARCH_PATH_CONFIG)); - path_basedir(config_file_directory); - - if (config_file_directory) - { - dir_init_shader( - p_rarch, - config_file_directory, - settings->bools.show_hidden_files); - free(config_file_directory); - } - } - } -#endif - return true; error: