From e5ab0792988bc39135930104a09ed61f5ce89dc7 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 9 Oct 2014 00:50:35 +0200 Subject: [PATCH] Maintain two rarch_setting_t * lists in driver.menu - one for main menu and the other for settings menu - regenerate these when needed --- frontend/menu/backend/menu_common_backend.c | 11 ++- frontend/menu/disp/glui.c | 2 +- frontend/menu/disp/lakka.c | 3 +- frontend/menu/disp/rgui.c | 2 +- frontend/menu/menu_action.c | 8 +-- frontend/menu/menu_common.c | 9 ++- frontend/menu/menu_driver.h | 5 +- frontend/menu/menu_entries.c | 23 +++++-- frontend/menu/menu_input_line_cb.c | 12 ++-- frontend/menu/menu_shader.c | 5 +- settings_data.c | 75 ++------------------- settings_data.h | 4 +- 12 files changed, 49 insertions(+), 110 deletions(-) diff --git a/frontend/menu/backend/menu_common_backend.c b/frontend/menu/backend/menu_common_backend.c index 659a5d5a38..efb2cfc35e 100644 --- a/frontend/menu/backend/menu_common_backend.c +++ b/frontend/menu/backend/menu_common_backend.c @@ -67,8 +67,7 @@ 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(SL_FLAG_ALL_SETTINGS, false); + rarch_setting_t *setting_data = (rarch_setting_t *)driver.menu->list_settings; file_list_t *list = (file_list_t*)driver.menu->selection_buf; if (!driver.menu || !setting_data) @@ -79,15 +78,14 @@ 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(SL_FLAG_ALL_SETTINGS, false)); + driver.menu->selection_ptr, driver.menu->list_settings); if (current_setting) strlcpy(needle, current_setting->name, sizeof(needle)); else if ((current_setting = (rarch_setting_t*)menu_entries_get_last_setting( list->list[driver.menu->selection_ptr].label, driver.menu->selection_ptr, - setting_data_get_mainmenu(true)))) + driver.menu->list_mainmenu))) { if (current_setting) strlcpy(needle, current_setting->name, sizeof(needle)); @@ -767,8 +765,7 @@ static int menu_action_ok(const char *menu_path, const char *label = NULL; const char *path = NULL; unsigned type = 0; - rarch_setting_t *setting_data = (rarch_setting_t *) - setting_data_get_list(SL_FLAG_ALL_SETTINGS, false); + rarch_setting_t *setting_data = (rarch_setting_t *)driver.menu->list_settings; 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 9efe435659..c9dc014d56 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(SL_FLAG_ALL_SETTINGS, false), + driver.menu->list_settings, driver.menu->selection_buf->list[i].label); (void)setting; diff --git a/frontend/menu/disp/lakka.c b/frontend/menu/disp/lakka.c index 2d2544c6f0..313c1affdd 100644 --- a/frontend/menu/disp/lakka.c +++ b/frontend/menu/disp/lakka.c @@ -801,8 +801,7 @@ static void lakka_context_destroy(void *data) void lakka_init_settings(void) { - rarch_setting_t *setting_data = (rarch_setting_t*) - setting_data_get_list(SL_FLAG_ALL_SETTINGS, false); + rarch_setting_t *setting_data = (rarch_setting_t*)driver.menu->list_settings; 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 30fe649027..35935885d5 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(SL_FLAG_ALL_SETTINGS, false), + driver.menu->list_settings, driver.menu->selection_buf->list[i].label); (void)setting; diff --git a/frontend/menu/menu_action.c b/frontend/menu/menu_action.c index 2750d2c286..2e9ecf1108 100644 --- a/frontend/menu/menu_action.c +++ b/frontend/menu/menu_action.c @@ -392,9 +392,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(SL_FLAG_ALL_SETTINGS, false) - ); + driver.menu->selection_ptr, driver.menu->list_settings); if (setting) return menu_action_handle_setting(setting, id, label, action); @@ -403,9 +401,7 @@ int menu_action_setting_set(unsigned id, const char *label, setting = (rarch_setting_t*)menu_entries_get_last_setting( list->list[driver.menu->selection_ptr].label, - driver.menu->selection_ptr, - setting_data_get_mainmenu(true) - ); + driver.menu->selection_ptr, driver.menu->list_mainmenu); if (setting) { diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index 6d0eb9dd00..3d4de04950 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -171,8 +171,12 @@ void *menu_init(const void *data) void menu_free_list(void *data) { - (void)data; + menu_handle_t *menu = (menu_handle_t*)data; + if (!menu) + return; + settings_list_free(menu->list_mainmenu); + settings_list_free(menu->list_settings); } void menu_init_list(void *data) @@ -181,6 +185,9 @@ void menu_init_list(void *data) if (!menu) return; + menu->list_mainmenu = setting_data_get_list(SL_FLAG_MAIN_MENU); + menu->list_settings = setting_data_get_list(SL_FLAG_ALL_SETTINGS); + file_list_push(menu->menu_stack, "", "mainmenu", MENU_SETTINGS, 0); menu_clear_navigation(menu); menu_entries_push_list(menu, menu->selection_buf, diff --git a/frontend/menu/menu_driver.h b/frontend/menu/menu_driver.h index da21d76a65..a5caa984a1 100644 --- a/frontend/menu/menu_driver.h +++ b/frontend/menu/menu_driver.h @@ -21,7 +21,7 @@ #include #include "../../boolean.h" #include "../../file_list.h" - +#include "../../settings_list.h" #ifdef __cplusplus extern "C" { @@ -123,6 +123,9 @@ typedef struct } keyboard; bool bind_mode_keyboard; + + rarch_setting_t *list_mainmenu; + rarch_setting_t *list_settings; } menu_handle_t; #ifdef __cplusplus diff --git a/frontend/menu/menu_entries.c b/frontend/menu/menu_entries.c index 708ae4c007..ea79475050 100644 --- a/frontend/menu/menu_entries.c +++ b/frontend/menu/menu_entries.c @@ -168,8 +168,6 @@ int menu_entries_push_list(menu_handle_t *menu, unsigned i; char tmp[256]; size_t list_size = 0; - rarch_setting_t *setting_data = (rarch_setting_t *) - setting_data_get_list(SL_FLAG_ALL_SETTINGS, true); bool do_action = false; #if 0 @@ -180,9 +178,10 @@ int menu_entries_push_list(menu_handle_t *menu, if (!strcmp(label, "mainmenu")) { - rarch_setting_t *setting; - setting_data = (rarch_setting_t *)setting_data_get_mainmenu(true); - setting = (rarch_setting_t*)setting_data_find_setting(setting_data, "Main Menu"); + settings_list_free(menu->list_mainmenu); + menu->list_mainmenu = (rarch_setting_t *) + setting_data_get_list(SL_FLAG_MAIN_MENU); + rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting(menu->list_mainmenu, "Main Menu"); file_list_clear(list); @@ -201,7 +200,10 @@ int menu_entries_push_list(menu_handle_t *menu, } else if (menu_type == MENU_FILE_CATEGORY) { - rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting(setting_data, + settings_list_free(menu->list_settings); + menu->list_settings = (rarch_setting_t *) + setting_data_get_list(SL_FLAG_ALL_SETTINGS); + rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting(menu->list_settings, label); file_list_clear(list); @@ -231,7 +233,10 @@ int menu_entries_push_list(menu_handle_t *menu, } else if (!strcmp(label, "settings")) { - rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting(setting_data, + settings_list_free(menu->list_settings); + menu->list_settings = (rarch_setting_t *) + setting_data_get_list(SL_FLAG_ALL_SETTINGS); + rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting(menu->list_settings, "Driver Options"); file_list_clear(list); @@ -423,6 +428,10 @@ int menu_entries_push_list(menu_handle_t *menu, } else if (!strcmp(label, "Input Options")) { + rarch_setting_t *setting_data = (rarch_setting_t*)menu->list_settings; + settings_list_free(setting_data); + setting_data = (rarch_setting_t *) + setting_data_get_list(SL_FLAG_ALL_SETTINGS); file_list_clear(list); file_list_push(list, "Player", "input_bind_player_no", 0, 0); file_list_push(list, "Device", "input_bind_device_id", 0, 0); diff --git a/frontend/menu/menu_input_line_cb.c b/frontend/menu/menu_input_line_cb.c index 88ed38c7c6..f0d3000a43 100644 --- a/frontend/menu/menu_input_line_cb.c +++ b/frontend/menu/menu_input_line_cb.c @@ -72,14 +72,12 @@ 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(SL_FLAG_ALL_SETTINGS, false); - if (str && *str && setting_data) + if (str && *str) { if ((current_setting = (rarch_setting_t*) setting_data_find_setting( - setting_data, menu->keyboard.label_setting))) + menu->list_settings, menu->keyboard.label_setting))) *current_setting->value.unsigned_integer = strtoul(str, NULL, 0); } menu_key_end_line(menu); @@ -89,14 +87,12 @@ 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(SL_FLAG_ALL_SETTINGS, false); - if (str && *str && setting_data) + if (str && *str) { if ((current_setting = (rarch_setting_t*) setting_data_find_setting( - setting_data, menu->keyboard.label_setting))) + menu->list_settings, menu->keyboard.label_setting))) menu_action_setting_set_current_string(current_setting, str); else menu_action_set_current_string_based_on_label( diff --git a/frontend/menu/menu_shader.c b/frontend/menu/menu_shader.c index 1fdbaa1151..54a53fed4e 100644 --- a/frontend/menu/menu_shader.c +++ b/frontend/menu/menu_shader.c @@ -361,14 +361,11 @@ 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(SL_FLAG_ALL_SETTINGS, false); - if (!strcmp(label, "video_shader_default_filter")) { if ((current_setting = setting_data_find_setting( - setting_data, "video_smooth"))) + driver.menu->list_settings, "video_smooth"))) menu_action_setting_boolean(current_setting, action); } else if (id >= MENU_SETTINGS_SHADER_PARAMETER_0 diff --git a/settings_data.c b/settings_data.c index b1fa3795cf..e35b5d3cfb 100644 --- a/settings_data.c +++ b/settings_data.c @@ -1732,7 +1732,7 @@ void setting_data_get_label(char *type_str, const char *menu_label, const char *label, unsigned index) { rarch_setting_t *setting_data = (rarch_setting_t*) - setting_data_get_list(SL_FLAG_ALL_SETTINGS, false); + driver.menu->list_settings; rarch_setting_t *setting = (rarch_setting_t*)setting_data_find_setting(setting_data, driver.menu->selection_buf->list[index].label); @@ -1825,7 +1825,7 @@ void setting_data_get_label(char *type_str, setting_data_get_string_representation(setting, type_str, type_str_size); else { - setting_data = (rarch_setting_t*)setting_data_get_mainmenu(true); + setting_data = (rarch_setting_t*)driver.menu->list_mainmenu; setting = (rarch_setting_t*)setting_data_find_setting(setting_data, driver.menu->selection_buf->list[index].label); @@ -4529,73 +4529,12 @@ bool setting_data_append_list_privacy_options( return true; } -#ifdef HAVE_MENU -/* TODO - combine this with setting_data_get_list. */ - -rarch_setting_t *setting_data_get_mainmenu(bool need_refresh) +rarch_setting_t *setting_data_get_list(unsigned mask) { - rarch_setting_info_t *list_info = NULL; static rarch_setting_t* list = NULL; - if (list) - { - if (!need_refresh) - return list; - - settings_list_free(list); - } - - list_info = (rarch_setting_info_t*)settings_info_list_new(); - if (!list_info) - return NULL; - - list = (rarch_setting_t*)settings_list_new(list_info->size); - if (!list) - goto error; - - if (!setting_data_append_list_main_menu_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)))) - goto error; - - settings_info_list_free(list_info); - - /* do not optimize into return realloc(), - * list is static and must be written. */ - return (rarch_setting_t*)list; - -error: - RARCH_ERR("Allocation failed.\n"); - settings_info_list_free(list_info); - settings_list_free(list); - - return NULL; -} -#endif - -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 (mask == last_mask) - if (!need_refresh) - return list; - - settings_list_free(list); - } - - list_info = (rarch_setting_info_t*)settings_info_list_new(); + rarch_setting_info_t *list_info = (rarch_setting_info_t*) + settings_info_list_new(); if (!list_info) return NULL; @@ -4698,11 +4637,9 @@ rarch_setting_t *setting_data_get_list(unsigned mask, bool need_refresh) 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; + return list; error: RARCH_ERR("Allocation failed.\n"); diff --git a/settings_data.h b/settings_data.h index a7d09d27df..d69e03c81a 100644 --- a/settings_data.h +++ b/settings_data.h @@ -87,13 +87,11 @@ int setting_data_get_description(const char *label, char *msg, size_t msg_sizeof); #ifdef HAVE_MENU -rarch_setting_t* setting_data_get_mainmenu(bool regenerate); - 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(unsigned mask, bool need_refresh); +rarch_setting_t* setting_data_get_list(unsigned mask); #ifdef __cplusplus }