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; }
int menu_cbs_init_bind_deferred_push(menu_file_list_cbs_t *cbs, const char *path, const char *label, unsigned type, size_t idx, const char *elem0, const char *elem1, uint32_t label_hash, uint32_t menu_label_hash) { settings_t *settings = config_get_ptr(); rarch_setting_t *setting = menu_setting_find(elem0); if (!cbs) return -1; cbs->action_deferred_push = deferred_push_default; if (setting) { uint32_t parent_group_hash = menu_hash_calculate(setting->parent_group); if ((parent_group_hash == MENU_VALUE_MAIN_MENU) && setting->type == ST_GROUP) { if (!settings->menu.collapse_subgroups_enable) { cbs->action_deferred_push = deferred_push_settings_subgroup; return 0; } } } if (menu_cbs_init_bind_deferred_push_compare_label(cbs, label, label_hash) == 0) return 0; if (menu_cbs_init_bind_deferred_push_compare_type(cbs, type, label_hash) == 0) return 0; return -1; }
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_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; }
void menu_entries_push(file_list_t *list, const char *path, const char *label, unsigned type, size_t directory_ptr, size_t entry_idx) { size_t idx; const menu_ctx_driver_t *driver = menu_ctx_driver_get_ptr(); menu_file_list_cbs_t *cbs = NULL; if (!list || !label) return; file_list_push(list, path, label, type, directory_ptr, entry_idx); idx = list->size - 1; if (driver->list_insert) driver->list_insert(list, path, label, idx); file_list_free_actiondata(list, idx); cbs = (menu_file_list_cbs_t*) calloc(1, sizeof(menu_file_list_cbs_t)); if (!cbs) return; file_list_set_actiondata(list, idx, cbs); cbs->setting = menu_setting_find(label); menu_cbs_init(list, cbs, path, label, type, idx); }
void menu_entries_push(file_list_t *list, const char *path, const char *label, unsigned type, size_t directory_ptr, size_t entry_idx) { menu_ctx_list_t list_info; size_t idx; menu_file_list_cbs_t *cbs = NULL; if (!list || !label) return; file_list_append(list, path, label, type, directory_ptr, entry_idx); idx = list->size - 1; list_info.list = list; list_info.path = path; list_info.label = label; list_info.idx = idx; menu_driver_ctl(RARCH_MENU_CTL_LIST_INSERT, &list_info); file_list_free_actiondata(list, idx); cbs = (menu_file_list_cbs_t*) calloc(1, sizeof(menu_file_list_cbs_t)); if (!cbs) return; file_list_set_actiondata(list, idx, cbs); cbs->setting = menu_setting_find(label); menu_cbs_init(list, cbs, path, label, type, idx); }
void menu_input_st_string_callback(void *userdata, const char *str) { menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return; if (str && *str) { rarch_setting_t *current_setting = NULL; global_t *global = global_get_ptr(); if ((current_setting = menu_setting_find(menu->keyboard.label_setting))) { strlcpy(current_setting->value.string, str, current_setting->size); menu_setting_generic(current_setting); } else { if (!strcmp(menu->keyboard.label_setting, "video_shader_preset_save_as")) menu_shader_manager_save_preset(str, false); else if (!strcmp(menu->keyboard.label_setting, "remap_file_save_as")) input_remapping_save_file(str); else if (!strcmp(menu->keyboard.label_setting, "cheat_file_save_as")) cheat_manager_save(global->cheat, str); } } menu_input_key_end_line(); }
int menu_setting_set(unsigned type, const char *label, unsigned action, bool wraparound) { int ret = 0; rarch_setting_t *setting = NULL; driver_t *driver = driver_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr(); if (!driver) return 0; setting = menu_setting_find( menu->menu_list->selection_buf->list [menu->navigation.selection_ptr].label); if (!setting) return 0; ret = menu_action_handle_setting(setting, type, action, wraparound); if (ret == -1) return 0; return ret; }
void menu_input_st_string_callback(void *userdata, const char *str) { if (str && *str) { rarch_setting_t *setting = NULL; const char *label = NULL; global_t *global = global_get_ptr(); menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_LABEL_SETTING, &label); setting = menu_setting_find(label); if (setting) { menu_setting_set_with_string_representation(setting, str); menu_setting_generic(setting, false); } else { uint32_t hash_label = menu_hash_calculate(label); switch (hash_label) { case MENU_LABEL_VIDEO_SHADER_PRESET_SAVE_AS: menu_shader_manager_save_preset(str, false); break; case MENU_LABEL_CHEAT_FILE_SAVE_AS: cheat_manager_save(global->cheat, str); break; } } } menu_input_key_end_line(); }
static int action_toggle_shader_filter_default(unsigned type, const char *label, unsigned action) { #ifdef HAVE_SHADER_MANAGER rarch_setting_t *setting = menu_setting_find("video_smooth"); if (setting) menu_setting_handler(setting, action); #endif return 0; }
static int action_left_shader_filter_default(unsigned type, const char *label, bool wraparound) { #ifdef HAVE_SHADER_MANAGER rarch_setting_t *setting = menu_setting_find(menu_hash_to_str(MENU_LABEL_VIDEO_SMOOTH)); if (!setting) return menu_cbs_exit(); return menu_action_handle_setting(setting, menu_setting_get_type(setting), MENU_ACTION_LEFT, wraparound); #else return 0; #endif }
static int action_iterate_info(char *s, size_t len, const char *label) { int ret = 0; char needle[PATH_MAX_LENGTH] = {0}; unsigned info_type = 0; rarch_setting_t *current_setting = NULL; file_list_t *list = NULL; menu_list_t *menu_list = menu_list_get_ptr(); size_t selection = menu_navigation_get_current_selection(); if (!menu_list) return 0; list = (file_list_t*)menu_list->selection_buf; menu_driver_render(); current_setting = menu_setting_find(list->list[selection].label); if (current_setting) strlcpy(needle, current_setting->name, sizeof(needle)); else if ((current_setting = menu_setting_find(list->list[selection].label))) { if (current_setting) strlcpy(needle, current_setting->name, sizeof(needle)); } else { const char *lbl = NULL; menu_list_get_at_offset(list, selection, NULL, &lbl, &info_type, NULL); if (lbl) strlcpy(needle, lbl, sizeof(needle)); } setting_get_description(needle, s, len); return ret; }
void menu_input_st_uint_callback(void *userdata, const char *str) { if (str && *str) { rarch_setting_t *setting = NULL; const char *label = NULL; menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_LABEL_SETTING, &label); setting = menu_setting_find(label); menu_setting_set_with_string_representation(setting, str); } menu_input_key_end_line(); }
void menu_input_st_uint_callback(void *userdata, const char *str) { menu_input_t *menu_input = menu_input_get_ptr(); if (!menu_input) return; if (str && *str) { rarch_setting_t *current_setting = NULL; if ((current_setting = menu_setting_find(menu_input->keyboard.label_setting))) setting_set_with_string_representation(current_setting, str); } menu_input_key_end_line(); }
void menu_input_st_uint_callback(void *userdata, const char *str) { menu_handle_t *menu = menu_driver_get_ptr(); if (!menu) return; if (str && *str) { rarch_setting_t *current_setting = NULL; if ((current_setting = menu_setting_find(menu->keyboard.label_setting))) *current_setting->value.unsigned_integer = strtoul(str, NULL, 0); } menu_input_key_end_line(); }
static int deferred_push_default(menu_displaylist_info_t *info) { settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); rarch_system_info_t *system = rarch_system_info_get_ptr(); info->type_default = MENU_FILE_PLAIN; info->setting = menu_setting_find(info->label); if (info->setting && info->setting->browser_selection_type == ST_DIR) {} else if (global->menu.info.valid_extensions) { if (*global->menu.info.valid_extensions) strlcpy(info->exts, global->menu.info.valid_extensions, sizeof(info->exts)); } else strlcpy(info->exts, system->valid_extensions, sizeof(info->exts)); (void)settings; if (settings->multimedia.builtin_mediaplayer_enable || settings->multimedia.builtin_imageviewer_enable) { struct retro_system_info sysinfo = {0}; (void)sysinfo; #ifdef HAVE_FFMPEG if (settings->multimedia.builtin_mediaplayer_enable) { libretro_ffmpeg_retro_get_system_info(&sysinfo); strlcat(info->exts, "|", sizeof(info->exts)); strlcat(info->exts, sysinfo.valid_extensions, sizeof(info->exts)); } #endif #ifdef HAVE_IMAGEVIEWER if (settings->multimedia.builtin_imageviewer_enable) { libretro_imageviewer_retro_get_system_info(&sysinfo); strlcat(info->exts, "|", sizeof(info->exts)); strlcat(info->exts, sysinfo.valid_extensions, sizeof(info->exts)); } #endif } return menu_displaylist_push_list(info, DISPLAYLIST_DEFAULT); }
void menu_entries_append(file_list_t *list, const char *path, const char *label, unsigned type, size_t directory_ptr, size_t entry_idx) { menu_ctx_list_t list_info; size_t idx; const char *menu_path = NULL; menu_file_list_cbs_t *cbs = NULL; if (!list || !label) return; file_list_append(list, path, label, type, directory_ptr, entry_idx); menu_entries_get_last_stack(&menu_path, NULL, NULL, NULL, NULL); idx = list->size - 1; list_info.list = list; list_info.path = path; list_info.fullpath = NULL; if (!string_is_empty(menu_path)) list_info.fullpath = strdup(menu_path); list_info.label = label; list_info.idx = idx; list_info.entry_type = type; menu_driver_ctl(RARCH_MENU_CTL_LIST_INSERT, &list_info); if (list_info.fullpath) free(list_info.fullpath); file_list_free_actiondata(list, idx); cbs = (menu_file_list_cbs_t*) calloc(1, sizeof(menu_file_list_cbs_t)); if (!cbs) return; file_list_set_actiondata(list, idx, cbs); cbs->enum_idx = MSG_UNKNOWN; cbs->setting = menu_setting_find(label); menu_cbs_init(list, cbs, path, label, type, idx); }
static void menu_action_setting_disp_set_label_setting_string(file_list_t* list, unsigned *w, unsigned type, unsigned i, const char *label, char *s, size_t len, const char *entry_label, const char *path, char *s2, size_t len2) { rarch_setting_t *setting = menu_setting_find(list->list[i].label); *w = 19; if (setting->value.target.string) strlcpy(s, setting->value.target.string, len); strlcpy(s2, path, len2); }
void menu_input_st_hex_callback(void *userdata, const char *str) { menu_input_t *menu_input = menu_input_get_ptr(); if (!menu_input) return; if (str && *str) { rarch_setting_t *current_setting = NULL; if ((current_setting = menu_setting_find(menu_input->keyboard.label_setting))) if (str[0] == '#') str++; *current_setting->value.unsigned_integer = strtoul(str, NULL, 16); } menu_input_key_end_line(); }
static void menu_action_setting_disp_set_label_setting_path(file_list_t* list, unsigned *w, unsigned type, unsigned i, const char *label, char *s, size_t len, const char *entry_label, const char *path, char *s2, size_t len2) { rarch_setting_t *setting = menu_setting_find(list->list[i].label); const char *basename = setting ? path_basename(setting->value.target.string) : NULL; *w = 19; if (!string_is_empty(basename)) strlcpy(s, basename, len); strlcpy(s2, path, len2); }
static int deferred_push_default(menu_displaylist_info_t *info) { global_t *global = global_get_ptr(); info->type_default = MENU_FILE_PLAIN; info->setting = menu_setting_find(info->label); if (info->setting && info->setting->browser_selection_type == ST_DIR) {} else if (global->menu.info.valid_extensions) { if (*global->menu.info.valid_extensions) snprintf(info->exts, sizeof(info->exts), "%s", global->menu.info.valid_extensions); } else strlcpy(info->exts, global->system.valid_extensions, sizeof(info->exts)); return menu_displaylist_push_list(info, DISPLAYLIST_DEFAULT); }
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); }
void menu_input_st_hex_callback(void *userdata, const char *str) { if (str && *str) { rarch_setting_t *setting = NULL; const char *label = NULL; menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_LABEL_SETTING, &label); setting = menu_setting_find(label); if (setting) { unsigned *ptr = (unsigned*)setting_get_ptr(setting); if (str[0] == '#') str++; *ptr = strtoul(str, NULL, 16); } } menu_input_key_end_line(); }
static int pointer_tap(menu_file_list_cbs_t *cbs, menu_entry_t *entry, unsigned action) { menu_handle_t *menu = menu_driver_get_ptr(); menu_list_t *menu_list = menu_list_get_ptr(); menu_navigation_t *nav = menu_navigation_get_ptr(); rarch_setting_t *setting = menu_setting_find( menu_list->selection_buf->list[nav->selection_ptr].label); if (menu->pointer.ptr == nav->selection_ptr && cbs && cbs->action_right && setting && (setting->type == ST_BOOL || setting->type == ST_UINT || setting->type == ST_FLOAT || setting->type == ST_STRING)) return menu_entry_action(entry, nav->selection_ptr, MENU_ACTION_RIGHT); else if (menu->pointer.ptr == nav->selection_ptr) return menu_entry_action(entry, nav->selection_ptr, MENU_ACTION_OK); else menu_navigation_set(nav, menu->pointer.ptr, false); return 0; }
void menu_input_st_string_callback(void *userdata, const char *str) { menu_input_t *menu_input = menu_input_get_ptr(); if (!menu_input) return; if (str && *str) { global_t *global = global_get_ptr(); rarch_setting_t *current_setting = menu_setting_find(menu_input->keyboard.label_setting); if (current_setting) { setting_set_with_string_representation(current_setting, str); menu_setting_generic(current_setting, false); } else { uint32_t hash_label = menu_hash_calculate(menu_input->keyboard.label_setting); switch (hash_label) { case MENU_LABEL_VIDEO_SHADER_PRESET_SAVE_AS: menu_shader_manager_save_preset(str, false); break; case MENU_LABEL_REMAP_FILE_SAVE_AS: input_remapping_save_file(str); break; case MENU_LABEL_CHEAT_FILE_SAVE_AS: cheat_manager_save(global->cheat, str); break; } } } menu_input_key_end_line(); }
static int action_ok_file_load(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(); global_t *global = global_get_ptr(); if (!menu) return -1; menu_list_get_last(menu->menu_list->menu_stack, &menu_path, &menu_label, NULL); setting = menu_setting_find(menu_label); if (setting && setting->type == ST_PATH) { menu_action_setting_set_current_string_path(setting, menu_path, path); menu_list_pop_stack_by_needle(menu->menu_list, setting->name); } else { if (type == MENU_FILE_IN_CARCHIVE) fill_pathname_join_delim(global->fullpath, menu_path, path, '#',sizeof(global->fullpath)); else fill_pathname_join(global->fullpath, menu_path, path, sizeof(global->fullpath)); menu_entries_common_load_content(true); return -1; } return 0; }
int menu_entries_push_list(menu_handle_t *menu, file_list_t *list, const char *path, const char *label, unsigned type, unsigned setting_flags) { rarch_setting_t *setting = NULL; settings_t *settings = config_get_ptr(); if (menu && menu->list_settings) settings_list_free(menu->list_settings); menu->list_settings = (rarch_setting_t *)setting_new(setting_flags); setting = (rarch_setting_t*)menu_setting_find(label); if (!setting) return -1; menu_list_clear(list); for (; setting->type != ST_END_GROUP; setting++) { if ( setting->type == ST_GROUP || setting->type == ST_SUB_GROUP || setting->type == ST_END_SUB_GROUP || (setting->flags & SD_FLAG_ADVANCED && !settings->menu.show_advanced_settings) ) continue; menu_list_push(list, setting->short_description, setting->name, menu_entries_setting_set_flags(setting), 0); } menu_driver_populate_entries(path, label, type); return 0; }
static void menu_action_setting_disp_set_label_setting_bool(file_list_t* list, unsigned *w, unsigned type, unsigned i, const char *label, char *s, size_t len, const char *entry_label, const char *path, char *s2, size_t len2) { rarch_setting_t *setting = menu_setting_find(list->list[i].label); *s = '\0'; *w = 19; if (setting) { if (*setting->value.target.boolean) strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ON), len); else strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), len); } strlcpy(s2, path, len2); }
// Performs whatever actions are associated with menu entry 'i'. This // is the most important function because it does all the work // associated with clicking on things in the UI. This includes loading // cores and updating the currently displayed menu int menu_entry_select(uint32_t i) { int ret = 0; menu_entry_t entry; enum menu_action action = MENU_ACTION_NOOP; menu_file_list_cbs_t *cbs = NULL; menu_navigation_t *nav = menu_navigation_get_ptr(); menu_list_t *menu_list = menu_list_get_ptr(); rarch_setting_t *setting = menu_setting_find( menu_list->selection_buf->list[i].label); menu_entry_get(&entry, i, NULL, false); cbs = menu_list_get_actiondata_at_offset(menu_list->selection_buf, i); if (setting_is_of_path_type(setting)) return 0; nav->selection_ptr = i; if ((cbs && cbs->action_ok) || setting_is_of_general_type(setting)) action = MENU_ACTION_OK; else { if (cbs && cbs->action_start) action = MENU_ACTION_START; if (cbs && cbs->action_right) action = MENU_ACTION_RIGHT; } if (action != MENU_ACTION_NOOP) ret = menu_entry_action(&entry, i, action); rarch_main_data_iterate(); return ret; }
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; }