static int action_ok_file_load_with_detect_core(const char *path, const char *label, unsigned type, size_t idx) { int ret; const char *menu_path = NULL; menu_handle_t *menu = menu_driver_get_ptr(); settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); if (!menu) return -1; menu_list_get_last_stack(menu->menu_list, &menu_path, NULL, NULL); ret = rarch_defer_core(global->core_info, menu_path, path, label, menu->deferred_path, sizeof(menu->deferred_path)); if (ret == -1) { event_command(EVENT_CMD_LOAD_CORE); menu_entries_common_load_content(false); return -1; } if (ret == 0) menu_list_push_stack_refresh( menu->menu_list, settings->libretro_directory, "deferred_core_list", 0, idx); return ret; }
static int action_ok_path_use_directory(const char *path, const char *label, unsigned type, size_t idx) { const char *menu_label = NULL; const char *menu_path = NULL; rarch_setting_t *setting = NULL; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; menu_list_get_last_stack(menu->menu_list, &menu_path, &menu_label, NULL); setting = menu_setting_find(menu_label); if (!setting) return -1; if (setting->type != ST_DIR) return -1; strlcpy(setting->value.string, menu_path, setting->size); menu_setting_generic(setting); menu_list_pop_stack_by_needle(menu->menu_list, setting->name); return 0; }
static int action_ok_directory_push(const char *path, const char *label, unsigned type, size_t idx) { menu_displaylist_info_t info = {0}; const char *menu_path = NULL; const char *menu_label = NULL; char cat_path[PATH_MAX_LENGTH]; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; if (!path) return -1; menu_list_get_last_stack(menu->menu_list, &menu_path, &menu_label, NULL); fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path)); info.list = menu->menu_list->menu_stack; info.type = type; info.directory_ptr = idx; strlcpy(info.path, cat_path, sizeof(info.path)); strlcpy(info.label, menu_label, sizeof(info.label)); return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC); }
static int archive_open(void) { char cat_path[PATH_MAX_LENGTH]; const char *menu_path = NULL; const char *menu_label = NULL; const char* path = NULL; unsigned int type = 0; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; menu_list_pop_stack(menu->menu_list); menu_list_get_last_stack(menu->menu_list, &menu_path, &menu_label, NULL); if (menu_list_get_size(menu->menu_list) == 0) return 0; menu_list_get_at_offset(menu->menu_list->selection_buf, menu->navigation.selection_ptr, &path, NULL, &type); fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path)); menu_list_push_stack_refresh( menu->menu_list, cat_path, menu_label, type, menu->navigation.selection_ptr); return 0; }
static int action_ok_menu_wallpaper_load(const char *path, const char *label, unsigned type, size_t idx) { char wallpaper_path[PATH_MAX_LENGTH]; const char *menu_label = NULL; const char *menu_path = NULL; rarch_setting_t *setting = NULL; menu_handle_t *menu = menu_driver_get_ptr(); settings_t *settings = config_get_ptr(); if (!menu) return -1; menu_list_get_last_stack(menu->menu_list, &menu_path, &menu_label, NULL); setting = menu_setting_find(menu_label); if (!setting) return -1; fill_pathname_join(wallpaper_path, menu_path, path, sizeof(wallpaper_path)); if (path_file_exists(wallpaper_path)) { strlcpy(settings->menu.wallpaper, wallpaper_path, sizeof(settings->menu.wallpaper)); rarch_main_data_msg_queue_push(DATA_TYPE_IMAGE, wallpaper_path, "cb_menu_wallpaper", 0, 1, true); } menu_list_pop_stack_by_needle(menu->menu_list, setting->name); return 0; }
static int action_ok_shader_preset_load(const char *path, const char *label, unsigned type, size_t idx) { const char *menu_path = NULL; char shader_path[PATH_MAX_LENGTH]; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; (void)shader_path; (void)menu_path; #ifdef HAVE_SHADER_MANAGER menu_list_get_last_stack(menu->menu_list, &menu_path, NULL, NULL); fill_pathname_join(shader_path, menu_path, path, sizeof(shader_path)); menu_shader_manager_set_preset(menu->shader, video_shader_parse_type(shader_path, RARCH_SHADER_NONE), shader_path); menu_list_flush_stack_by_needle(menu->menu_list, "shader_options"); return 0; #else return -1; #endif }
static int action_ok_video_filter_file_load(const char *path, const char *label, unsigned type, size_t idx) { char filter_path[PATH_MAX_LENGTH]; const char *menu_path = NULL; menu_handle_t *menu = menu_driver_get_ptr(); settings_t *settings = config_get_ptr(); if (!menu) return -1; (void)filter_path; (void)menu_path; menu_list_get_last_stack(menu->menu_list, &menu_path, NULL, NULL); fill_pathname_join(filter_path, menu_path, path, sizeof(filter_path)); strlcpy(settings->video.softfilter_plugin, filter_path, sizeof(settings->video.softfilter_plugin)); event_command(EVENT_CMD_REINIT); menu_list_flush_stack_by_needle(menu->menu_list, "video_options"); return 0; }
static int action_ok_cheat_file_load(const char *path, const char *label, unsigned type, size_t idx) { const char *menu_path = NULL; char cheat_path[PATH_MAX_LENGTH]; menu_handle_t *menu = menu_driver_get_ptr(); global_t *global = global_get_ptr(); if (!menu) return -1; (void)cheat_path; (void)menu_path; menu_list_get_last_stack(menu->menu_list, &menu_path, NULL, NULL); fill_pathname_join(cheat_path, menu_path, path, sizeof(cheat_path)); if (global->cheat) cheat_manager_free(global->cheat); global->cheat = cheat_manager_load(cheat_path); if (!global->cheat) return -1; menu_list_flush_stack_by_needle(menu->menu_list, "core_cheat_options"); return 0; }
static int action_ok_shader_pass_load(const char *path, const char *label, unsigned type, size_t idx) { const char *menu_path = NULL; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; (void)menu_path; #ifdef HAVE_SHADER_MANAGER menu_list_get_last_stack(menu->menu_list, &menu_path, NULL, NULL); fill_pathname_join(menu->shader->pass[hack_shader_pass].source.path, menu_path, path, sizeof(menu->shader->pass[hack_shader_pass].source.path)); /* This will reset any changed parameters. */ video_shader_resolve_parameters(NULL, menu->shader); menu_list_flush_stack_by_needle(menu->menu_list, "shader_options"); return 0; #else return -1; #endif }
int menu_entry_pathdir_set_value(uint32_t i, const char *s) { const char *menu_label = NULL; const char *menu_path = NULL; rarch_setting_t *setting = NULL; menu_list_t *menu_list = menu_list_get_ptr(); menu_list_get_last_stack(menu_list, &menu_path, &menu_label, NULL, NULL); setting = menu_setting_find(menu_label); if (!setting) return -1; if (setting->type != ST_DIR) return -1; (void)s; setting_set_with_string_representation(setting, menu_path); menu_setting_generic(setting, false); menu_list_pop_stack_by_needle(menu_list, setting->name); return 0; }
static int menu_archive_open(void) { char cat_path[PATH_MAX]; const char *menu_path = NULL; const char *menu_label = NULL; const char* path = NULL; unsigned int type = 0; menu_list_pop_stack(driver.menu->menu_list); menu_list_get_last_stack(driver.menu->menu_list, &menu_path, &menu_label, NULL); if (menu_list_get_size(driver.menu->menu_list) == 0) return 0; menu_list_get_at_offset(driver.menu->menu_list->selection_buf, driver.menu->selection_ptr, &path, NULL, &type); fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path)); menu_list_push_stack_refresh( driver.menu->menu_list, cat_path, menu_label, type, driver.menu->selection_ptr); return 0; }
static int archive_load(void) { int ret = 0; menu_displaylist_info_t info = {0}; const char *menu_path = NULL; const char *menu_label = NULL; const char* path = NULL; size_t entry_idx = 0; settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); size_t selected = menu_navigation_get_current_selection(); menu_handle_t *menu = menu_driver_get_ptr(); menu_list_t *menu_list = menu_list_get_ptr(); if (!menu || !menu_list) return -1; menu_list_pop_stack(menu_list); menu_list_get_last_stack(menu_list, &menu_path, &menu_label, NULL, NULL); if (menu_list_get_size(menu_list) == 0) return 0; menu_list_get_at_offset(menu_list->selection_buf, selected, &path, NULL, NULL, &entry_idx); ret = rarch_defer_core(global->core_info, menu_path, path, menu_label, menu->deferred_path, sizeof(menu->deferred_path)); fill_pathname_join(detect_content_path, menu_path, path, sizeof(detect_content_path)); switch (ret) { case -1: event_command(EVENT_CMD_LOAD_CORE); menu_common_load_content(false, CORE_TYPE_PLAIN); break; case 0: info.list = menu_list->menu_stack; info.type = 0; info.directory_ptr = selected; strlcpy(info.path, settings->libretro_directory, sizeof(info.path)); strlcpy(info.label, menu_hash_to_str(MENU_LABEL_DEFERRED_CORE_LIST), sizeof(info.label)); ret = menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC); break; } return ret; }
// Sets title to what the name of the current menu should be void menu_entries_get_title(char *title, size_t title_len) { const char *dir = NULL; const char *label = NULL; unsigned menu_type = 0; menu_list_t *menu_list = menu_list_get_ptr(); if (!menu_list) return; menu_list_get_last_stack(menu_list, &dir, &label, &menu_type); get_title(label, dir, menu_type, title, title_len); }
void menu_entries_cbs_init(void *data, const char *path, const char *label, unsigned type, size_t idx) { struct string_list *str_list = NULL; char elem0[PATH_MAX_LENGTH], elem1[PATH_MAX_LENGTH]; const char *menu_label = NULL; menu_file_list_cbs_t *cbs = NULL; file_list_t *list = (file_list_t*)data; menu_handle_t *menu = menu_driver_resolve(); if (!menu) return; if (!list) return; if (!(cbs = (menu_file_list_cbs_t*)list->list[idx].actiondata)) return; menu_list_get_last_stack(menu->menu_list, NULL, &menu_label, NULL); if (label) str_list = string_split(label, "|"); if (str_list && str_list->size > 0) strlcpy(elem0, str_list->elems[0].data, sizeof(elem0)); else elem0[0]='\0'; if (str_list && str_list->size > 1) strlcpy(elem1, str_list->elems[1].data, sizeof(elem1)); else elem1[0]='\0'; if (str_list) { string_list_free(str_list); str_list = NULL; } menu_entries_cbs_init_bind_ok(cbs, path, label, type, idx, elem0, elem1, menu_label); menu_entries_cbs_init_bind_cancel(cbs, path, label, type, idx, elem0, elem1); menu_entries_cbs_init_bind_start(cbs, path, label, type, idx, elem0, elem1); menu_entries_cbs_init_bind_select(cbs, path, label, type, idx, elem0, elem1); menu_entries_cbs_init_bind_content_list_switch(cbs, path, label, type, idx, elem0, elem1); menu_entries_cbs_init_bind_up_or_down(cbs, path, label, type, idx, elem0, elem1); menu_entries_cbs_init_bind_toggle(cbs, path, label, type, idx, elem0, elem1, menu_label); menu_entries_cbs_init_bind_deferred_push(cbs, path, label, type, idx, elem0, elem1); menu_entries_cbs_init_bind_refresh(cbs, path, label, type, idx, elem0, elem1); menu_entries_cbs_init_bind_iterate(cbs, path, label, type, idx, elem0, elem1); menu_entries_cbs_init_bind_get_string_representation(cbs, path, label, type, idx, elem0, elem1); }
static int action_ok_record_configfile_load(const char *path, const char *label, unsigned type, size_t idx) { const char *menu_path = NULL; global_t *global = global_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr(); if (!menu || !global) return -1; menu_list_get_last_stack(menu->menu_list, &menu_path, NULL, NULL); fill_pathname_join(global->record.config, menu_path, path, sizeof(global->record.config)); menu_list_flush_stack_by_needle(menu->menu_list, "Recording Settings"); return 0; }
static int archive_load(void) { int ret; const char *menu_path = NULL; const char *menu_label = NULL; const char* path = NULL; unsigned int type = 0; menu_handle_t *menu = menu_driver_get_ptr(); settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); if (!menu) return -1; menu_list_pop_stack(menu->menu_list); menu_list_get_last_stack(menu->menu_list, &menu_path, &menu_label, NULL); if (menu_list_get_size(menu->menu_list) == 0) return 0; menu_list_get_at_offset(menu->menu_list->selection_buf, menu->navigation.selection_ptr, &path, NULL, &type); ret = rarch_defer_core(global->core_info, menu_path, path, menu_label, menu->deferred_path, sizeof(menu->deferred_path)); switch (ret) { case -1: event_command(EVENT_CMD_LOAD_CORE); menu_entries_common_load_content(false); break; case 0: menu_list_push_stack_refresh( menu->menu_list, settings->libretro_directory, "deferred_core_list", 0, menu->navigation.selection_ptr); break; } return 0; }
static int action_scan_directory(const char *path, const char *label, unsigned type, size_t idx) { char fullpath[PATH_MAX_LENGTH]; const char *menu_label = NULL; const char *menu_path = NULL; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; menu_list_get_last_stack(menu->menu_list, &menu_path, &menu_label, NULL); fill_pathname_join(fullpath, menu_path, path, sizeof(fullpath)); rarch_main_data_msg_queue_push(DATA_TYPE_DB, fullpath, "cb_db_scan", 0, 1, true); return 0; }
enum menu_entry_type menu_entry_get_type(uint32_t i) { rarch_setting_t *setting; const char *path = NULL, *entry_label = NULL; unsigned type = 0; const char *dir = NULL; const char *label = NULL; menu_list_t *menu_list = menu_list_get_ptr(); unsigned menu_type = 0; menu_list_get_last_stack(menu_list, &dir, &label, &menu_type); menu_list_get_at_offset(menu_list->selection_buf, i, &path, &entry_label, &type); setting = menu_entry_get_setting(i); // XXX Really a special kind of ST_ACTION, but this should be // changed if (setting_is_of_path_type(setting)) return MENU_ENTRY_PATH; else if (setting && setting->type == ST_BOOL ) return MENU_ENTRY_BOOL; else if (setting && setting->type == ST_BIND ) return MENU_ENTRY_BIND; else if (setting_is_of_enum_type(setting)) return MENU_ENTRY_ENUM; else if (setting && setting->type == ST_INT ) return MENU_ENTRY_INT; else if (setting && setting->type == ST_UINT ) return MENU_ENTRY_UINT; else if (setting && setting->type == ST_FLOAT ) return MENU_ENTRY_FLOAT; else if (setting && setting->type == ST_PATH ) return MENU_ENTRY_PATH; else if (setting && setting->type == ST_DIR ) return MENU_ENTRY_DIR; else if (setting && setting->type == ST_STRING ) return MENU_ENTRY_STRING; else if (setting && setting->type == ST_HEX ) return MENU_ENTRY_HEX; else return MENU_ENTRY_ACTION; }
static int rmenu_entry_iterate(unsigned action) { const char *label = NULL; menu_file_list_cbs_t *cbs = NULL; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; cbs = (menu_file_list_cbs_t*)menu_list_get_actiondata_at_offset( menu->menu_list->selection_buf, menu->navigation.selection_ptr); menu_list_get_last_stack(menu->menu_list, NULL, &label, NULL); if (cbs && cbs->action_iterate) return cbs->action_iterate(label, action); return -1; }
static rarch_setting_t *menu_entry_get_setting(uint32_t i) { const char *path = NULL; const char *entry_label = NULL; const char *dir = NULL; const char *label = NULL; menu_list_t *menu_list = menu_list_get_ptr(); unsigned type = 0; unsigned menu_type = 0; menu_list_get_last_stack(menu_list, &dir, &label, &menu_type, NULL); menu_list_get_at_offset(menu_list->selection_buf, i, &path, &entry_label, &type, NULL); return menu_setting_find( menu_list->selection_buf->list[i].label); }
int menu_entry_iterate(unsigned action) { const char *label = NULL; menu_file_list_cbs_t *cbs = NULL; menu_list_t *menu_list = menu_list_get_ptr(); if (!menu_list) return -1; if (action != MENU_ACTION_NOOP || menu_entries_needs_refresh() || menu_display_update_pending()) menu_display_fb_set_dirty(); cbs = (menu_file_list_cbs_t*)menu_list_get_last_stack_actiondata(menu_list); menu_list_get_last_stack(menu_list, NULL, &label, NULL, NULL); if (cbs && cbs->action_iterate) return cbs->action_iterate(label, action); return -1; }
static int action_ok_directory_push(const char *path, const char *label, unsigned type, size_t idx) { const char *menu_path = NULL; const char *menu_label = NULL; char cat_path[PATH_MAX_LENGTH]; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; if (!path) return -1; menu_list_get_last_stack(menu->menu_list, &menu_path, &menu_label, NULL); fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path)); return menu_list_push_stack_refresh(menu->menu_list, cat_path, menu_label, type, idx); }
static int action_ok_disk_image_append(const char *path, const char *label, unsigned type, size_t idx) { char image[PATH_MAX_LENGTH]; const char *menu_path = NULL; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; menu_list_get_last_stack(menu->menu_list, &menu_path, NULL, NULL); fill_pathname_join(image, menu_path, path, sizeof(image)); event_disk_control_append_image(image); event_command(EVENT_CMD_RESUME); menu_list_flush_stack(menu->menu_list, MENU_SETTINGS); return -1; }
static int menu_archive_load(void) { int ret; const char *menu_path = NULL; const char *menu_label = NULL; const char* path = NULL; unsigned int type = 0; menu_list_pop_stack(driver.menu->menu_list); menu_list_get_last_stack(driver.menu->menu_list, &menu_path, &menu_label, NULL); if (menu_list_get_size(driver.menu->menu_list) == 0) return 0; menu_list_get_at_offset(driver.menu->menu_list->selection_buf, driver.menu->selection_ptr, &path, NULL, &type); ret = rarch_defer_core(g_extern.core_info, menu_path, path, driver.menu->deferred_path, sizeof(driver.menu->deferred_path)); switch (ret) { case -1: rarch_main_command(RARCH_CMD_LOAD_CORE); menu_common_load_content(); break; case 0: menu_list_push_stack_refresh( driver.menu->menu_list, g_settings.libretro_directory, "deferred_core_list", 0, driver.menu->selection_ptr); break; } return 0; }
static int action_ok_core_load(const char *path, const char *label, unsigned type, size_t idx) { const char *menu_path = NULL; menu_handle_t *menu = menu_driver_get_ptr(); settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); if (!menu) return -1; (void)global; menu_list_get_last_stack(menu->menu_list, &menu_path, NULL, NULL); fill_pathname_join(settings->libretro, menu_path, path, sizeof(settings->libretro)); event_command(EVENT_CMD_LOAD_CORE); menu_list_flush_stack(menu->menu_list, NULL, MENU_SETTINGS); #if defined(HAVE_DYNAMIC) /* No content needed for this core, load core immediately. */ if (menu->load_no_content && settings->core.set_supports_no_game_enable) { *global->fullpath = '\0'; menu_entries_common_load_content(false); return -1; } return 0; /* Core selection on non-console just updates directory listing. * Will take effect on new content load. */ #elif defined(RARCH_CONSOLE) event_command(EVENT_CMD_RESTART_RETROARCH); return -1; #endif }
void menu_entry_get(menu_entry_t *entry, size_t i, void *userdata, bool use_representation) { const char *label = NULL; const char *path = NULL; const char *entry_label = NULL; menu_file_list_cbs_t *cbs = NULL; file_list_t *list = NULL; menu_list_t *menu_list = menu_list_get_ptr(); if (!menu_list) return; menu_list_get_last_stack(menu_list, NULL, &label, NULL, NULL); list = userdata ? (file_list_t*)userdata : menu_list->selection_buf; if (!list) return; menu_list_get_at_offset(list, i, &path, &entry_label, &entry->type, &entry->entry_idx); cbs = menu_list_get_actiondata_at_offset(list, i); if (cbs && cbs->action_get_value && use_representation) cbs->action_get_value(list, &entry->spacing, entry->type, i, label, entry->value, sizeof(entry->value), entry_label, path, entry->path, sizeof(entry->path)); entry->idx = i; if (path && !use_representation) strlcpy(entry->path, path, sizeof(entry->path)); if (entry_label) strlcpy(entry->label, entry_label, sizeof(entry->label)); }
static int archive_open(void) { char cat_path[PATH_MAX_LENGTH] = {0}; menu_displaylist_info_t info = {0}; const char *menu_path = NULL; const char *menu_label = NULL; const char* path = NULL; unsigned int type = 0; size_t entry_idx = 0; menu_navigation_t *nav = menu_navigation_get_ptr(); menu_list_t *menu_list = menu_list_get_ptr(); if (!menu_list || !nav) return -1; menu_list_pop_stack(menu_list); menu_list_get_last_stack(menu_list, &menu_path, &menu_label, NULL, NULL); if (menu_list_get_size(menu_list) == 0) return 0; menu_list_get_at_offset(menu_list->selection_buf, nav->selection_ptr, &path, NULL, &type, &entry_idx); fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path)); fill_pathname_join(detect_content_path, menu_path, path, sizeof(detect_content_path)); info.list = menu_list->menu_stack; info.type = type; info.directory_ptr = nav->selection_ptr; strlcpy(info.path, cat_path, sizeof(info.path)); strlcpy(info.label, menu_label, sizeof(info.label)); return menu_displaylist_push_list(&info, DISPLAYLIST_GENERIC); }
static int action_ok_remap_file_load(const char *path, const char *label, unsigned type, size_t idx) { const char *menu_path = NULL; char remap_path[PATH_MAX_LENGTH]; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; (void)remap_path; (void)menu_path; menu_list_get_last_stack(menu->menu_list, &menu_path, NULL, NULL); fill_pathname_join(remap_path, menu_path, path, sizeof(remap_path)); input_remapping_load_file(remap_path); menu_list_flush_stack_by_needle(menu->menu_list, "core_input_remapping_options"); return 0; }
int menu_entries_deferred_push(file_list_t *list, file_list_t *menu_list) { unsigned type = 0; const char *path = NULL; const char *label = NULL; menu_file_list_cbs_t *cbs = NULL; driver_t *driver = driver_get_ptr(); menu_list_get_last_stack(driver->menu->menu_list, &path, &label, &type); if (!strcmp(label, "Main Menu")) return menu_entries_push_list(driver->menu, list, path, label, type, SL_FLAG_MAIN_MENU); else if (!strcmp(label, "Horizontal Menu")) return menu_entries_push_horizontal_menu_list(driver->menu, list, path, label, type); cbs = (menu_file_list_cbs_t*) menu_list_get_last_stack_actiondata(driver->menu->menu_list); if (!cbs->action_deferred_push) return 0; return cbs->action_deferred_push(list, menu_list, path, label, type); }
static int action_ok_set_path(const char *path, const char *label, unsigned type, size_t idx) { const char *menu_path = NULL; const char *menu_label = NULL; rarch_setting_t *setting = NULL; menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return -1; menu_list_get_last_stack(menu->menu_list, &menu_path, &menu_label, NULL); setting = menu_setting_find(menu_label); if (!setting) return -1; menu_action_setting_set_current_string_path(setting, menu_path, path); menu_list_pop_stack_by_needle(menu->menu_list, setting->name); return 0; }