diff --git a/frontend/menu/backend/menu_common_backend.c b/frontend/menu/backend/menu_common_backend.c index 44595bc983..f69b3fe33a 100644 --- a/frontend/menu/backend/menu_common_backend.c +++ b/frontend/menu/backend/menu_common_backend.c @@ -68,7 +68,8 @@ static int menu_info_screen_iterate(unsigned action) char needle[PATH_MAX]; unsigned info_type = 0; rarch_setting_t *current_setting = NULL; - rarch_setting_t *setting_data = (rarch_setting_t *)setting_data_get_list(false); + rarch_setting_t *setting_data = (rarch_setting_t *) + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false); file_list_t *list = (file_list_t*)driver.menu->selection_buf; if (!driver.menu || !setting_data) @@ -80,7 +81,7 @@ static int menu_info_screen_iterate(unsigned action) current_setting = (rarch_setting_t*)menu_entries_get_last_setting( list->list[driver.menu->selection_ptr].label, driver.menu->selection_ptr, - setting_data_get_list(false)); + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false)); if (current_setting) strlcpy(needle, current_setting->name, sizeof(needle)); @@ -768,7 +769,7 @@ static int menu_action_ok(const char *menu_path, const char *path = NULL; unsigned type = 0; rarch_setting_t *setting_data = (rarch_setting_t *) - setting_data_get_list(false); + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false); rarch_setting_t *setting = (rarch_setting_t*) setting_data_find_setting(setting_data, menu_label); diff --git a/frontend/menu/disp/glui.c b/frontend/menu/disp/glui.c index 70e31a5537..9efe435659 100644 --- a/frontend/menu/disp/glui.c +++ b/frontend/menu/disp/glui.c @@ -246,7 +246,7 @@ static void glui_frame(void) file_list_get_at_offset(driver.menu->selection_buf, i, &path, &entry_label, &type); rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting( - setting_data_get_list(false), + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false), driver.menu->selection_buf->list[i].label); (void)setting; diff --git a/frontend/menu/disp/lakka.c b/frontend/menu/disp/lakka.c index c4eb8a8118..2d2544c6f0 100644 --- a/frontend/menu/disp/lakka.c +++ b/frontend/menu/disp/lakka.c @@ -801,8 +801,8 @@ static void lakka_context_destroy(void *data) void lakka_init_settings(void) { - rarch_setting_t *setting_data = (rarch_setting_t*)setting_data_get_list(false); - + rarch_setting_t *setting_data = (rarch_setting_t*) + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false); menu_category_t *category = (menu_category_t*)&categories[0]; strlcpy(category->name, "Settings", sizeof(category->name)); diff --git a/frontend/menu/disp/rgui.c b/frontend/menu/disp/rgui.c index a0014adcdb..30fe649027 100644 --- a/frontend/menu/disp/rgui.c +++ b/frontend/menu/disp/rgui.c @@ -356,7 +356,7 @@ static void rgui_render(void) file_list_get_at_offset(driver.menu->selection_buf, i, &path, &entry_label, &type); rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting( - setting_data_get_list(false), + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false), driver.menu->selection_buf->list[i].label); (void)setting; diff --git a/frontend/menu/menu_action.c b/frontend/menu/menu_action.c index 93485bf54e..2750d2c286 100644 --- a/frontend/menu/menu_action.c +++ b/frontend/menu/menu_action.c @@ -393,7 +393,7 @@ int menu_action_setting_set(unsigned id, const char *label, rarch_setting_t *setting = (rarch_setting_t*)menu_entries_get_last_setting( list->list[driver.menu->selection_ptr].label, driver.menu->selection_ptr, - setting_data_get_list(false) + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false) ); if (setting) diff --git a/frontend/menu/menu_entries.c b/frontend/menu/menu_entries.c index 6372ebaad2..708ae4c007 100644 --- a/frontend/menu/menu_entries.c +++ b/frontend/menu/menu_entries.c @@ -169,7 +169,7 @@ int menu_entries_push_list(menu_handle_t *menu, char tmp[256]; size_t list_size = 0; rarch_setting_t *setting_data = (rarch_setting_t *) - setting_data_get_list(true); + setting_data_get_list(SL_FLAG_ALL_SETTINGS, true); bool do_action = false; #if 0 diff --git a/frontend/menu/menu_input_line_cb.c b/frontend/menu/menu_input_line_cb.c index 747d1fd120..88ed38c7c6 100644 --- a/frontend/menu/menu_input_line_cb.c +++ b/frontend/menu/menu_input_line_cb.c @@ -72,7 +72,8 @@ void st_uint_callback(void *userdata, const char *str) { menu_handle_t *menu = (menu_handle_t*)userdata; rarch_setting_t *current_setting = NULL; - rarch_setting_t *setting_data = (rarch_setting_t *)setting_data_get_list(false); + rarch_setting_t *setting_data = (rarch_setting_t *) + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false); if (str && *str && setting_data) { @@ -88,7 +89,8 @@ void st_string_callback(void *userdata, const char *str) { menu_handle_t *menu = (menu_handle_t*)userdata; rarch_setting_t *current_setting = NULL; - rarch_setting_t *setting_data = (rarch_setting_t *)setting_data_get_list(false); + rarch_setting_t *setting_data = (rarch_setting_t *) + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false); if (str && *str && setting_data) { diff --git a/frontend/menu/menu_shader.c b/frontend/menu/menu_shader.c index c3158614de..1fdbaa1151 100644 --- a/frontend/menu/menu_shader.c +++ b/frontend/menu/menu_shader.c @@ -361,7 +361,8 @@ int menu_shader_manager_setting_toggle( #endif rarch_setting_t *current_setting = NULL; - rarch_setting_t *setting_data = (rarch_setting_t *)setting_data_get_list(false); + rarch_setting_t *setting_data = (rarch_setting_t *) + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false); if (!strcmp(label, "video_shader_default_filter")) diff --git a/settings_data.c b/settings_data.c index 776aff1319..c961afe471 100644 --- a/settings_data.c +++ b/settings_data.c @@ -1731,7 +1731,8 @@ void setting_data_get_label(char *type_str, size_t type_str_size, unsigned *w, unsigned type, const char *menu_label, const char *label, unsigned index) { - rarch_setting_t *setting_data = (rarch_setting_t*)setting_data_get_list(false); + rarch_setting_t *setting_data = (rarch_setting_t*) + setting_data_get_list(SL_FLAG_ALL_SETTINGS, false); rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting(setting_data, driver.menu->selection_buf->list[index].label); @@ -4557,7 +4558,8 @@ rarch_setting_t *setting_data_get_mainmenu(bool need_refresh) goto error; /* flatten this array to save ourselves some kilobytes */ - if (!(list = (rarch_setting_t*)realloc(list, list_info->index * sizeof(rarch_setting_t)))) + if (!(list = (rarch_setting_t*) + realloc(list, list_info->index * sizeof(rarch_setting_t)))) goto error; settings_info_list_free(list_info); @@ -4575,15 +4577,17 @@ error: } #endif -rarch_setting_t *setting_data_get_list(bool need_refresh) +rarch_setting_t *setting_data_get_list(unsigned mask, bool need_refresh) { + static unsigned last_mask = 0; rarch_setting_info_t *list_info = NULL; static rarch_setting_t* list = NULL; if (list) { - if (!need_refresh) - return list; + if (mask == last_mask) + if (!need_refresh) + return list; settings_list_free(list); } @@ -4596,56 +4600,103 @@ rarch_setting_t *setting_data_get_list(bool need_refresh) if (!list) goto error; - if (!setting_data_append_list_driver_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_MAIN_MENU) + { + if (!setting_data_append_list_main_menu_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_general_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_DRIVER_OPTIONS) + { + if (!setting_data_append_list_driver_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_video_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_GENERAL_OPTIONS) + { + if (!setting_data_append_list_general_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_shader_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_GENERAL_OPTIONS) + { + if (!setting_data_append_list_video_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_font_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_SHADER_OPTIONS) + { + if (!setting_data_append_list_shader_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_audio_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_FONT_OPTIONS) + { + if (!setting_data_append_list_font_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_input_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_AUDIO_OPTIONS) + { + if (!setting_data_append_list_audio_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_overlay_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_INPUT_OPTIONS) + { + if (!setting_data_append_list_input_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_menu_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_OVERLAY_OPTIONS) + { + if (!setting_data_append_list_overlay_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_netplay_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_MENU_OPTIONS) + { + if (!setting_data_append_list_menu_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_user_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_NETPLAY_OPTIONS) + { + if (!setting_data_append_list_netplay_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_path_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_USER_OPTIONS) + { + if (!setting_data_append_list_user_options(&list, list_info)) + goto error; + } - if (!setting_data_append_list_privacy_options(&list, list_info)) - goto error; + if (mask & SL_FLAG_PATH_OPTIONS) + { + if (!setting_data_append_list_path_options(&list, list_info)) + goto error; + } + if (mask & SL_FLAG_PRIVACY_OPTIONS) + { + if (!setting_data_append_list_privacy_options(&list, list_info)) + goto error; + } rarch_setting_t terminator = { ST_NONE }; if (!(settings_list_append(&list, list_info, terminator))) goto error; /* flatten this array to save ourselves some kilobytes. */ - if (!(list = (rarch_setting_t*)realloc(list, list_info->index * sizeof(rarch_setting_t)))) + if (!(list = (rarch_setting_t*) + realloc(list, list_info->index * sizeof(rarch_setting_t)))) goto error; settings_info_list_free(list_info); + last_mask = mask; + /* do not optimize into return realloc(), * list is static and must be written. */ return (rarch_setting_t*)list; diff --git a/settings_data.h b/settings_data.h index da6a144112..a7d09d27df 100644 --- a/settings_data.h +++ b/settings_data.h @@ -93,7 +93,7 @@ void setting_data_get_label(char *type_str, size_t type_str_size, unsigned *w, unsigned type, const char *menu_label, const char *label, unsigned index); #endif -rarch_setting_t* setting_data_get_list(bool need_refresh); +rarch_setting_t* setting_data_get_list(unsigned mask, bool need_refresh); #ifdef __cplusplus } diff --git a/settings_list.h b/settings_list.h index 33e5af351d..99d215746a 100644 --- a/settings_list.h +++ b/settings_list.h @@ -58,6 +58,27 @@ enum setting_flags SD_FLAG_IS_CATEGORY = (1 << 10), }; +enum setting_list_flags +{ + SL_FLAG_MAIN_MENU = (1 << 0), + SL_FLAG_DRIVER_OPTIONS = (1 << 1), + SL_FLAG_GENERAL_OPTIONS = (1 << 2), + SL_FLAG_VIDEO_OPTIONS = (1 << 3), + SL_FLAG_SHADER_OPTIONS = (1 << 4), + SL_FLAG_FONT_OPTIONS = (1 << 5), + SL_FLAG_AUDIO_OPTIONS = (1 << 6), + SL_FLAG_INPUT_OPTIONS = (1 << 7), + SL_FLAG_OVERLAY_OPTIONS = (1 << 8), + SL_FLAG_MENU_OPTIONS = (1 << 9), + SL_FLAG_NETPLAY_OPTIONS = (1 << 10), + SL_FLAG_USER_OPTIONS = (1 << 11), + SL_FLAG_PATH_OPTIONS = (1 << 12), + SL_FLAG_PRIVACY_OPTIONS = (1 << 13), + SL_FLAG_ALL = (1 << 14), +}; + +#define SL_FLAG_ALL_SETTINGS (SL_FLAG_ALL - SL_FLAG_MAIN_MENU) + typedef void (*change_handler_t)(void *data); typedef struct rarch_setting_info