static inline bool menu_list_elem_is_dir(file_list_t *buf, unsigned offset) { const char *path = NULL; unsigned type = 0; file_list_get_at_offset(buf, offset, &path, &type); return type != RGUI_FILE_PLAIN; }
void menu_entries_get_at_offset(const file_list_t *list, size_t idx, const char **path, const char **label, unsigned *file_type, size_t *entry_idx, const char **alt) { file_list_get_at_offset(list, idx, path, label, file_type, entry_idx); file_list_get_alt_at_offset(list, idx, alt); }
void file_list_get_last(const file_list_t *list, const char **path, const char **label, unsigned *file_type) { if (list->size) file_list_get_at_offset(list, list->size - 1, path, label, file_type); }
void file_list_get_last(const file_list_t *list, const char **path, unsigned *file_type) { if (!list) return; if (list->size) file_list_get_at_offset(list, list->size - 1, path, file_type); }
void file_list_get_last(const file_list_t *list, const char **path, const char **label, unsigned *file_type, size_t *entry_idx) { if (!list) return; if (list->size) file_list_get_at_offset(list, list->size - 1, path, label, file_type, entry_idx); }
static int menu_info_screen_iterate(unsigned action) { char msg[PATH_MAX]; char needle[PATH_MAX]; unsigned info_type = 0; rarch_setting_t *current_setting = NULL; 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) return 0; if (driver.video_data && driver.menu_ctx && driver.menu_ctx->render) driver.menu_ctx->render(); current_setting = (rarch_setting_t*)menu_entries_get_last_setting( list->list[driver.menu->selection_ptr].label, 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, driver.menu->list_mainmenu))) { if (current_setting) strlcpy(needle, current_setting->name, sizeof(needle)); } else { const char *label = NULL; file_list_get_at_offset(driver.menu->selection_buf, driver.menu->selection_ptr, NULL, &label, &info_type); if (label) strlcpy(needle, label, sizeof(needle)); } setting_data_get_description(needle, msg, sizeof(msg)); if (driver.video_data && driver.menu_ctx && driver.menu_ctx->render_messagebox) { if (*msg && msg[0] != '\0') driver.menu_ctx->render_messagebox(msg); } if (action == MENU_ACTION_OK) menu_entries_pop(driver.menu->menu_stack); return 0; }
static void menu_entries_build_scroll_indices(file_list_t *list) { int current; bool current_is_dir = false; unsigned type = 0; size_t i, scroll_value = 0; menu_driver_ctl(MENU_NAVIGATION_CTL_CLEAR_SCROLL_INDICES, NULL); menu_driver_ctl(MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX, &scroll_value); current = menu_entries_elem_get_first_char(list, 0); file_list_get_at_offset(list, 0, NULL, NULL, &type, NULL); file_list_get_alt_at_offset(list, 0, NULL); if (type == FILE_TYPE_DIRECTORY) current_is_dir = true; for (i = 1; i < list->size; i++) { int first = menu_entries_elem_get_first_char(list, (unsigned)i); bool is_dir = false; unsigned idx = (unsigned)i; file_list_get_at_offset(list, idx, NULL, NULL, &type, NULL); file_list_get_alt_at_offset(list, idx, NULL); if (type == FILE_TYPE_DIRECTORY) is_dir = true; if ((current_is_dir && !is_dir) || (first > current)) menu_driver_ctl(MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX, &i); current = first; current_is_dir = is_dir; } scroll_value = list->size - 1; menu_driver_ctl(MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX, &scroll_value); }
/** * menu_entries_elem_get_first_char: * @list : File list handle. * @offset : Offset index of element. * * Gets the first character of an element in the * file list. * * Returns: first character of element in file list. **/ static int menu_entries_elem_get_first_char( file_list_t *list, unsigned offset) { int ret = 0; const char *path = NULL; file_list_get_at_offset(list, offset, NULL, NULL, NULL, NULL); file_list_get_alt_at_offset(list, offset, &path); if (path) ret = tolower((int)*path); /* "Normalize" non-alphabetical entries so they * are lumped together for purposes of jumping. */ if (ret < 'a') return ('a' - 1); else if (ret > 'z') return ('z' + 1); return ret; }
void ozone_context_destroy_horizontal_list(ozone_handle_t *ozone) { unsigned i; size_t list_size = ozone_list_get_size(ozone, MENU_LIST_HORIZONTAL); for (i = 0; i < list_size; i++) { const char *path = NULL; ozone_node_t *node = (ozone_node_t*)file_list_get_userdata_at_offset(ozone->horizontal_list, i); if (!node) continue; file_list_get_at_offset(ozone->horizontal_list, i, &path, NULL, NULL, NULL); if (!path || !strstr(path, file_path_str(FILE_PATH_LPL_EXTENSION))) continue; video_driver_texture_unload(&node->icon); video_driver_texture_unload(&node->content_icon); } }
void menu_list_get_at_offset(const file_list_t *list, size_t idx, const char **path, const char **label, unsigned *file_type) { file_list_get_at_offset(list, idx, path, label, file_type); }
static void rmenu_xui_render(void) { size_t begin, end; char title[256]; const char *dir = NULL; unsigned menu_type = 0; unsigned menu_type_is = 0; if (!driver.menu || driver.menu->need_refresh && (g_extern.lifecycle_state & (1ULL << MODE_MENU)) && !driver.menu->msg_force) return; begin = driver.menu->selection_ptr; end = file_list_get_size(driver.menu->selection_buf); rmenu_xui_render_background(); file_list_get_last(driver.menu->menu_stack, &dir, &menu_type); if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->type_is) menu_type_is = driver.menu_ctx->backend->type_is(menu_type); if (menu_type == MENU_SETTINGS_CORE) snprintf(title, sizeof(title), "CORE SELECTION %s", dir); else if (menu_type == MENU_SETTINGS_DEFERRED_CORE) snprintf(title, sizeof(title), "DETECTED CORES %s", dir); else if (menu_type == MENU_SETTINGS_CONFIG) snprintf(title, sizeof(title), "CONFIG %s", dir); else if (menu_type == MENU_SETTINGS_DISK_APPEND) snprintf(title, sizeof(title), "DISK APPEND %s", dir); else if (menu_type == MENU_SETTINGS_VIDEO_OPTIONS) strlcpy(title, "VIDEO OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_INPUT_OPTIONS) strlcpy(title, "INPUT OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_OVERLAY_OPTIONS) strlcpy(title, "OVERLAY OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_NETPLAY_OPTIONS) strlcpy(title, "NETPLAY OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_PATH_OPTIONS) strlcpy(title, "PATH OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_OPTIONS) strlcpy(title, "SETTINGS", sizeof(title)); else if (menu_type == MENU_SETTINGS_DRIVERS) strlcpy(title, "DRIVER OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_PERFORMANCE_COUNTERS) strlcpy(title, "PERFORMANCE COUNTERS", sizeof(title)); else if (menu_type == MENU_SETTINGS_PERFORMANCE_COUNTERS_LIBRETRO) strlcpy(title, "CORE PERFORMANCE COUNTERS", sizeof(title)); else if (menu_type == MENU_SETTINGS_PERFORMANCE_COUNTERS_FRONTEND) strlcpy(title, "FRONTEND PERFORMANCE COUNTERS", sizeof(title)); #ifdef HAVE_SHADER_MANAGER else if (menu_type == MENU_SETTINGS_SHADER_OPTIONS) strlcpy(title, "SHADER OPTIONS", sizeof(title)); #endif else if (menu_type == MENU_SETTINGS_FONT_OPTIONS) strlcpy(title, "FONT OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_GENERAL_OPTIONS) strlcpy(title, "GENERAL OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_AUDIO_OPTIONS) strlcpy(title, "AUDIO OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_DISK_OPTIONS) strlcpy(title, "DISK OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_CORE_OPTIONS) strlcpy(title, "CORE OPTIONS", sizeof(title)); else if (menu_type == MENU_SETTINGS_CORE_INFO) strlcpy(title, "CORE INFO", sizeof(title)); else if (menu_type == MENU_SETTINGS_PRIVACY_OPTIONS) strlcpy(title, "PRIVACY OPTIONS", sizeof(title)); #ifdef HAVE_SHADER_MANAGER else if (menu_type_is == MENU_SETTINGS_SHADER_OPTIONS) snprintf(title, sizeof(title), "SHADER %s", dir); #endif else if ((menu_type == MENU_SETTINGS_INPUT_OPTIONS) || (menu_type == MENU_SETTINGS_PATH_OPTIONS) || (menu_type == MENU_SETTINGS_OPTIONS) || (menu_type == MENU_SETTINGS_CUSTOM_VIEWPORT || menu_type == MENU_SETTINGS_CUSTOM_VIEWPORT_2) || menu_type == MENU_SETTINGS_CUSTOM_BIND || menu_type == MENU_START_SCREEN || menu_type == MENU_SETTINGS) snprintf(title, sizeof(title), "MENU %s", dir); else if (menu_type == MENU_SETTINGS_OPEN_HISTORY) strlcpy(title, "LOAD HISTORY", sizeof(title)); else if (menu_type == MENU_INFO_SCREEN) strlcpy(title, "INFO", sizeof(title)); #ifdef HAVE_OVERLAY else if (menu_type == MENU_SETTINGS_OVERLAY_PRESET) snprintf(title, sizeof(title), "OVERLAY %s", dir); #endif else if (menu_type == MENU_SETTINGS_VIDEO_SOFTFILTER) snprintf(title, sizeof(title), "FILTER %s", dir); else if (menu_type == MENU_SETTINGS_AUDIO_DSP_FILTER) snprintf(title, sizeof(title), "DSP FILTER %s", dir); else if (menu_type == MENU_BROWSER_DIR_PATH) snprintf(title, sizeof(title), "BROWSER DIR %s", dir); else if (menu_type == MENU_CONTENT_DIR_PATH) snprintf(title, sizeof(title), "CONTENT DIR %s", dir); else if (menu_type == MENU_SCREENSHOT_DIR_PATH) snprintf(title, sizeof(title), "SCREENSHOT DIR %s", dir); else if (menu_type == MENU_AUTOCONFIG_DIR_PATH) snprintf(title, sizeof(title), "AUTOCONFIG DIR %s", dir); else if (menu_type == MENU_SHADER_DIR_PATH) snprintf(title, sizeof(title), "SHADER DIR %s", dir); else if (menu_type == MENU_FILTER_DIR_PATH) snprintf(title, sizeof(title), "FILTER DIR %s", dir); else if (menu_type == MENU_DSP_FILTER_DIR_PATH) snprintf(title, sizeof(title), "DSP_FILTER DIR %s", dir); else if (menu_type == MENU_SAVESTATE_DIR_PATH) snprintf(title, sizeof(title), "SAVESTATE DIR %s", dir); #ifdef HAVE_DYNAMIC else if (menu_type == MENU_LIBRETRO_DIR_PATH) snprintf(title, sizeof(title), "LIBRETRO DIR %s", dir); #endif else if (menu_type == MENU_CONFIG_DIR_PATH) snprintf(title, sizeof(title), "CONFIG DIR %s", dir); else if (menu_type == MENU_SAVEFILE_DIR_PATH) snprintf(title, sizeof(title), "SAVEFILE DIR %s", dir); #ifdef HAVE_OVERLAY else if (menu_type == MENU_OVERLAY_DIR_PATH) snprintf(title, sizeof(title), "OVERLAY DIR %s", dir); #endif else if (menu_type == MENU_SYSTEM_DIR_PATH) snprintf(title, sizeof(title), "SYSTEM DIR %s", dir); else if (menu_type == MENU_ASSETS_DIR_PATH) snprintf(title, sizeof(title), "ASSETS DIR %s", dir); else { if (driver.menu->defer_core) snprintf(title, sizeof(title), "CONTENT %s", dir); else { const char *core_name = driver.menu->info.library_name; if (!core_name) core_name = g_extern.system.info.library_name; if (!core_name) core_name = "No Core"; snprintf(title, sizeof(title), "CONTENT (%s) %s", core_name, dir); } } mbstowcs(strw_buffer, title, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitle, strw_buffer); char title_buf[256]; menu_ticker_line(title_buf, RXUI_TERM_WIDTH - 3, g_extern.frame_count / 15, title, true); blit_line(RXUI_TERM_START_X + 15, 15, title_buf, true); char title_msg[64]; const char *core_name = driver.menu->info.library_name; if (!core_name) core_name = g_extern.system.info.library_name; if (!core_name) core_name = "No Core"; const char *core_version = driver.menu->info.library_version; if (!core_version) core_version = g_extern.system.info.library_version; if (!core_version) core_version = ""; snprintf(title_msg, sizeof(title_msg), "%s - %s %s", PACKAGE_VERSION, core_name, core_version); blit_line(RXUI_TERM_START_X + 15, (RXUI_TERM_HEIGHT * FONT_HEIGHT_STRIDE) + RXUI_TERM_START_Y + 2, title_msg, true); unsigned x, y; size_t i; x = RXUI_TERM_START_X; y = RXUI_TERM_START_Y; for (i = begin; i < end; i++/*, y += FONT_HEIGHT_STRIDE */) { const char *path = 0; unsigned type = 0; file_list_get_at_offset(driver.menu->selection_buf, i, &path, &type); char message[256]; char type_str[256]; unsigned w = 19; if (menu_type == MENU_SETTINGS_INPUT_OPTIONS || menu_type == MENU_SETTINGS_CUSTOM_BIND) w = 21; else if (menu_type == MENU_SETTINGS_PATH_OPTIONS) w = 24; if (type >= MENU_SETTINGS_SHADER_FILTER && type <= MENU_SETTINGS_SHADER_LAST) { // HACK. Work around that we're using the menu_type as dir type to propagate state correctly. if ((menu_type_is == MENU_SETTINGS_SHADER_OPTIONS) && (menu_type_is == MENU_SETTINGS_SHADER_OPTIONS)) { type = MENU_FILE_DIRECTORY; strlcpy(type_str, "(DIR)", sizeof(type_str)); w = 5; } else if (type == MENU_SETTINGS_SHADER_OPTIONS || type == MENU_SETTINGS_SHADER_PRESET) strlcpy(type_str, "...", sizeof(type_str)); else if (type == MENU_SETTINGS_SHADER_FILTER) snprintf(type_str, sizeof(type_str), "%s", g_settings.video.smooth ? "Linear" : "Nearest"); else if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_get_str) driver.menu_ctx->backend->shader_manager_get_str(driver.menu->shader, type_str, sizeof(type_str), type); } else // Pretty-print libretro cores from menu. if (menu_type == MENU_SETTINGS_CORE || menu_type == MENU_SETTINGS_DEFERRED_CORE) { if (type == MENU_FILE_PLAIN) { strlcpy(type_str, "(CORE)", sizeof(type_str)); file_list_get_alt_at_offset(driver.menu->selection_buf, i, &path); w = 6; } else { strlcpy(type_str, "(DIR)", sizeof(type_str)); type = MENU_FILE_DIRECTORY; w = 5; } } else if (menu_type == MENU_SETTINGS_CONFIG || #ifdef HAVE_OVERLAY menu_type == MENU_SETTINGS_OVERLAY_PRESET || #endif menu_type == MENU_SETTINGS_VIDEO_SOFTFILTER || menu_type == MENU_SETTINGS_AUDIO_DSP_FILTER || menu_type == MENU_SETTINGS_DISK_APPEND || menu_type_is == MENU_FILE_DIRECTORY) { if (type == MENU_FILE_PLAIN) { strlcpy(type_str, "(FILE)", sizeof(type_str)); w = 6; } else if (type == MENU_FILE_USE_DIRECTORY) { *type_str = '\0'; w = 0; } else { strlcpy(type_str, "(DIR)", sizeof(type_str)); type = MENU_FILE_DIRECTORY; w = 5; } } else if (menu_type == MENU_SETTINGS_OPEN_HISTORY) { *type_str = '\0'; w = 0; } else if (type >= MENU_SETTINGS_CORE_OPTION_START) strlcpy(type_str, core_option_get_val(g_extern.system.core_options, type - MENU_SETTINGS_CORE_OPTION_START), sizeof(type_str)); else if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->setting_set_label) driver.menu_ctx->backend->setting_set_label(type_str, sizeof(type_str), &w, type); char entry_title_buf[256]; char type_str_buf[64]; bool selected = i == driver.menu->selection_ptr; strlcpy(entry_title_buf, path, sizeof(entry_title_buf)); strlcpy(type_str_buf, type_str, sizeof(type_str_buf)); #if 0 if ((type == MENU_FILE_PLAIN || type == MENU_FILE_DIRECTORY)) menu_ticker_line(entry_title_buf, RXUI_TERM_WIDTH - (w + 1 + 2), g_extern.frame_count / 15, path, selected); else menu_ticker_line(type_str_buf, w, g_extern.frame_count / 15, type_str, selected); #endif snprintf(message, sizeof(message), "%s : %s", entry_title_buf, type_str_buf); wchar_t msg_w[256]; mbstowcs(msg_w, message, sizeof(msg_w) / sizeof(wchar_t)); XuiListSetText(m_menulist, i, msg_w); blit_line(x, y, message, i); } if (driver.menu->keyboard.display) { char msg[1024]; const char *str = *driver.menu->keyboard.buffer; if (!str) str = ""; snprintf(msg, sizeof(msg), "%s\n%s", driver.menu->keyboard.label, str); rmenu_xui_render_messagebox(msg); } }
void ozone_context_reset_horizontal_list(ozone_handle_t *ozone) { unsigned i; const char *title; char title_noext[255]; char *chr; bool hyphen_found; size_t list_size = ozone_list_get_size(ozone, MENU_LIST_HORIZONTAL); for (i = 0; i < list_size; i++) { const char *path = NULL; ozone_node_t *node = (ozone_node_t*)file_list_get_userdata_at_offset(ozone->horizontal_list, i); if (!node) { node = ozone_alloc_node(); if (!node) continue; } file_list_get_at_offset(ozone->horizontal_list, i, &path, NULL, NULL, NULL); if (!path) continue; if (!strstr(path, file_path_str(FILE_PATH_LPL_EXTENSION))) continue; { struct texture_image ti; char *sysname = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); char *texturepath = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); char *content_texturepath = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); char *icons_path = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); strlcpy(icons_path, ozone->icons_path, PATH_MAX_LENGTH * sizeof(char)); sysname[0] = texturepath[0] = content_texturepath[0] = '\0'; fill_pathname_base_noext(sysname, path, PATH_MAX_LENGTH * sizeof(char)); fill_pathname_join_concat(texturepath, icons_path, sysname, file_path_str(FILE_PATH_PNG_EXTENSION), PATH_MAX_LENGTH * sizeof(char)); /* If the playlist icon doesn't exist return default */ if (!filestream_exists(texturepath)) fill_pathname_join_concat(texturepath, icons_path, "default", file_path_str(FILE_PATH_PNG_EXTENSION), PATH_MAX_LENGTH * sizeof(char)); ti.width = 0; ti.height = 0; ti.pixels = NULL; ti.supports_rgba = video_driver_supports_rgba(); if (image_texture_load(&ti, texturepath)) { if(ti.pixels) { video_driver_texture_unload(&node->icon); video_driver_texture_load(&ti, TEXTURE_FILTER_MIPMAP_LINEAR, &node->icon); } image_texture_free(&ti); } fill_pathname_join_delim(sysname, sysname, file_path_str(FILE_PATH_CONTENT_BASENAME), '-', PATH_MAX_LENGTH * sizeof(char)); strlcat(content_texturepath, icons_path, PATH_MAX_LENGTH * sizeof(char)); strlcat(content_texturepath, path_default_slash(), PATH_MAX_LENGTH * sizeof(char)); strlcat(content_texturepath, sysname, PATH_MAX_LENGTH * sizeof(char)); /* If the content icon doesn't exist return default-content */ if (!filestream_exists(content_texturepath)) { strlcat(icons_path, path_default_slash(), PATH_MAX_LENGTH * sizeof(char)); strlcat(icons_path, "default", PATH_MAX_LENGTH * sizeof(char)); fill_pathname_join_delim(content_texturepath, icons_path, file_path_str(FILE_PATH_CONTENT_BASENAME), '-', PATH_MAX_LENGTH * sizeof(char)); } if (image_texture_load(&ti, content_texturepath)) { if(ti.pixels) { video_driver_texture_unload(&node->content_icon); video_driver_texture_load(&ti, TEXTURE_FILTER_MIPMAP_LINEAR, &node->content_icon); } image_texture_free(&ti); } /* Console name */ menu_entries_get_at_offset( ozone->horizontal_list, i, &title, NULL, NULL, NULL, NULL); fill_pathname_base_noext(title_noext, title, sizeof(title_noext)); /* Format : "Vendor - Console" Remove everything before the hyphen and the subsequent space */ chr = title_noext; hyphen_found = false; while (true) { if (*chr == '-') { hyphen_found = true; break; } else if (*chr == '\0') break; chr++; } if (hyphen_found) chr += 2; else chr = title_noext; if (node->console_name) free(node->console_name); node->console_name = strdup(chr); free(sysname); free(texturepath); free(content_texturepath); free(icons_path); } } }
static void rmenu_render(void *data) { if (!render_normal) { render_normal = true; return; } rgui_handle_t *rgui = (rgui_handle_t*)data; font_params_t font_parms; if (rgui->need_refresh && (g_extern.lifecycle_state & (1ULL << MODE_MENU)) && !rgui->msg_force) return; size_t begin = rgui->selection_ptr >= (ENTRIES_HEIGHT / 2) ? (rgui->selection_ptr - (ENTRIES_HEIGHT / 2)) : 0; size_t end = (rgui->selection_ptr + ENTRIES_HEIGHT) <= rgui->selection_buf->size ? rgui->selection_ptr + ENTRIES_HEIGHT : rgui->selection_buf->size; if (rgui->selection_buf->size <= ENTRIES_HEIGHT) begin = 0; if (end - begin > ENTRIES_HEIGHT) end = begin + ENTRIES_HEIGHT; rmenu_render_background(rgui); char title[256]; const char *dir = NULL; unsigned menu_type = 0; unsigned menu_type_is = 0; file_list_get_last(rgui->menu_stack, &dir, &menu_type); if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->type_is) menu_type_is = driver.menu_ctx->backend->type_is(menu_type); if (menu_type == RGUI_SETTINGS_CORE) snprintf(title, sizeof(title), "CORE SELECTION %s", dir); else if (menu_type == RGUI_SETTINGS_DEFERRED_CORE) snprintf(title, sizeof(title), "DETECTED CORES %s", dir); else if (menu_type == RGUI_SETTINGS_CONFIG) snprintf(title, sizeof(title), "CONFIG %s", dir); else if (menu_type == RGUI_SETTINGS_DISK_APPEND) snprintf(title, sizeof(title), "DISK APPEND %s", dir); else if (menu_type == RGUI_SETTINGS_VIDEO_OPTIONS) strlcpy(title, "VIDEO OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_DRIVERS) strlcpy(title, "DRIVER OPTIONS", sizeof(title)); #ifdef HAVE_SHADER_MANAGER else if (menu_type == RGUI_SETTINGS_SHADER_OPTIONS) strlcpy(title, "SHADER OPTIONS", sizeof(title)); #endif else if (menu_type == RGUI_SETTINGS_AUDIO_OPTIONS) strlcpy(title, "AUDIO OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_OVERLAY_OPTIONS) strlcpy(title, "OVERLAY OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_NETPLAY_OPTIONS) strlcpy(title, "NETPLAY OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_FONT_OPTIONS) strlcpy(title, "FONT OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_GENERAL_OPTIONS) strlcpy(title, "GENERAL OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_PATH_OPTIONS) strlcpy(title, "PATH OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_OPTIONS) strlcpy(title, "SETTINGS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_INPUT_OPTIONS) strlcpy(title, "INPUT OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_DISK_OPTIONS) strlcpy(title, "DISK OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_CORE_OPTIONS) strlcpy(title, "CORE OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_CORE_INFO) strlcpy(title, "CORE INFO", sizeof(title)); else if (menu_type == RGUI_SETTINGS_PRIVACY_OPTIONS) strlcpy(title, "PRIVACY OPTIONS", sizeof(title)); #ifdef HAVE_SHADER_MANAGER else if (menu_type_is == RGUI_SETTINGS_SHADER_OPTIONS) snprintf(title, sizeof(title), "SHADER %s", dir); #endif else if ((menu_type == RGUI_SETTINGS_INPUT_OPTIONS) || (menu_type == RGUI_SETTINGS_PATH_OPTIONS) || (menu_type == RGUI_SETTINGS_OPTIONS) || (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT || menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2) || menu_type == RGUI_SETTINGS_CUSTOM_BIND || menu_type == RGUI_START_SCREEN || menu_type == RGUI_SETTINGS) snprintf(title, sizeof(title), "MENU %s", dir); else if (menu_type == RGUI_SETTINGS_OPEN_HISTORY) strlcpy(title, "LOAD HISTORY", sizeof(title)); #ifdef HAVE_OVERLAY else if (menu_type == RGUI_SETTINGS_OVERLAY_PRESET) snprintf(title, sizeof(title), "OVERLAY %s", dir); #endif else if (menu_type == RGUI_SETTINGS_VIDEO_SOFTFILTER) snprintf(title, sizeof(title), "FILTER %s", dir); else if (menu_type == RGUI_SETTINGS_AUDIO_DSP_FILTER) snprintf(title, sizeof(title), "DSP FILTER %s", dir); else if (menu_type == RGUI_BROWSER_DIR_PATH) snprintf(title, sizeof(title), "BROWSER DIR %s", dir); else if (menu_type == RGUI_CONTENT_DIR_PATH) snprintf(title, sizeof(title), "CONTENT DIR %s", dir); #ifdef HAVE_SCREENSHOTS else if (menu_type == RGUI_SCREENSHOT_DIR_PATH) snprintf(title, sizeof(title), "SCREENSHOT DIR %s", dir); #endif else if (menu_type == RGUI_AUTOCONFIG_DIR_PATH) snprintf(title, sizeof(title), "AUTOCONFIG DIR %s", dir); else if (menu_type == RGUI_SHADER_DIR_PATH) snprintf(title, sizeof(title), "SHADER DIR %s", dir); else if (menu_type == RGUI_FILTER_DIR_PATH) snprintf(title, sizeof(title), "FILTER DIR %s", dir); else if (menu_type == RGUI_DSP_FILTER_DIR_PATH) snprintf(title, sizeof(title), "DSP FILTER DIR %s", dir); else if (menu_type == RGUI_SAVESTATE_DIR_PATH) snprintf(title, sizeof(title), "SAVESTATE DIR %s", dir); #ifdef HAVE_DYNAMIC else if (menu_type == RGUI_LIBRETRO_DIR_PATH) snprintf(title, sizeof(title), "LIBRETRO DIR %s", dir); #endif else if (menu_type == RGUI_CONFIG_DIR_PATH) snprintf(title, sizeof(title), "CONFIG DIR %s", dir); else if (menu_type == RGUI_SAVEFILE_DIR_PATH) snprintf(title, sizeof(title), "SAVEFILE DIR %s", dir); #ifdef HAVE_OVERLAY else if (menu_type == RGUI_OVERLAY_DIR_PATH) snprintf(title, sizeof(title), "OVERLAY DIR %s", dir); #endif else if (menu_type == RGUI_SYSTEM_DIR_PATH) snprintf(title, sizeof(title), "SYSTEM DIR %s", dir); else if (menu_type == RGUI_ASSETS_DIR_PATH) snprintf(title, sizeof(title), "ASSETS DIR %s", dir); else { if (rgui->defer_core) snprintf(title, sizeof(title), "CONTENT %s", dir); else { const char *core_name = rgui->info.library_name; if (!core_name) core_name = g_extern.system.info.library_name; if (!core_name) core_name = "No Core"; snprintf(title, sizeof(title), "CONTENT (%s) %s", core_name, dir); } } char title_buf[256]; menu_ticker_line(title_buf, RMENU_TERM_WIDTH, g_extern.frame_count / 15, title, true); font_parms.x = POSITION_EDGE_MIN + POSITION_OFFSET; font_parms.y = POSITION_EDGE_MIN + POSITION_RENDER_OFFSET - (POSITION_OFFSET*2); font_parms.scale = FONT_SIZE_NORMAL; font_parms.color = WHITE; if (driver.video_data && driver.video_poke && driver.video_poke->set_osd_msg) driver.video_poke->set_osd_msg(driver.video_data, title_buf, &font_parms); char title_msg[64]; const char *core_name = rgui->info.library_name; if (!core_name) core_name = g_extern.system.info.library_name; if (!core_name) core_name = "No Core"; const char *core_version = rgui->info.library_version; if (!core_version) core_version = g_extern.system.info.library_version; if (!core_version) core_version = ""; font_parms.x = POSITION_EDGE_MIN + POSITION_OFFSET; font_parms.y = POSITION_EDGE_MAX - (POSITION_OFFSET*2); font_parms.scale = FONT_SIZE_NORMAL; font_parms.color = WHITE; snprintf(title_msg, sizeof(title_msg), "%s - %s %s", PACKAGE_VERSION, core_name, core_version); if (driver.video_data && driver.video_poke && driver.video_poke->set_osd_msg) driver.video_poke->set_osd_msg(driver.video_data, title_msg, &font_parms); size_t i, j; j = 0; for (i = begin; i < end; i++, j++) { const char *path = 0; unsigned type = 0; file_list_get_at_offset(rgui->selection_buf, i, &path, &type); char message[256]; char type_str[256]; unsigned w = 19; if (menu_type == RGUI_SETTINGS_INPUT_OPTIONS || menu_type == RGUI_SETTINGS_CUSTOM_BIND) w = 21; else if (menu_type == RGUI_SETTINGS_PATH_OPTIONS) w = 24; #ifdef HAVE_SHADER_MANAGER if (type >= RGUI_SETTINGS_SHADER_FILTER && type <= RGUI_SETTINGS_SHADER_LAST) { // HACK. Work around that we're using the menu_type as dir type to propagate state correctly. if ((menu_type_is == RGUI_SETTINGS_SHADER_OPTIONS) && (menu_type_is == RGUI_SETTINGS_SHADER_OPTIONS)) { type = RGUI_FILE_DIRECTORY; strlcpy(type_str, "(DIR)", sizeof(type_str)); w = 5; } else if (type == RGUI_SETTINGS_SHADER_OPTIONS || type == RGUI_SETTINGS_SHADER_PRESET) strlcpy(type_str, "...", sizeof(type_str)); else if (type == RGUI_SETTINGS_SHADER_FILTER) snprintf(type_str, sizeof(type_str), "%s", g_settings.video.smooth ? "Linear" : "Nearest"); else if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->shader_manager_get_str) driver.menu_ctx->backend->shader_manager_get_str(&rgui->shader, type_str, sizeof(type_str), type); } else #endif // Pretty-print libretro cores from menu. if (menu_type == RGUI_SETTINGS_CORE || menu_type == RGUI_SETTINGS_DEFERRED_CORE) { if (type == RGUI_FILE_PLAIN) { strlcpy(type_str, "(CORE)", sizeof(type_str)); file_list_get_alt_at_offset(rgui->selection_buf, i, &path); w = 6; } else { strlcpy(type_str, "(DIR)", sizeof(type_str)); type = RGUI_FILE_DIRECTORY; w = 5; } } else if (menu_type == RGUI_SETTINGS_CONFIG || #ifdef HAVE_OVERLAY menu_type == RGUI_SETTINGS_OVERLAY_PRESET || #endif menu_type == RGUI_SETTINGS_VIDEO_SOFTFILTER || menu_type == RGUI_SETTINGS_AUDIO_DSP_FILTER || menu_type == RGUI_SETTINGS_DISK_APPEND || menu_type_is == RGUI_FILE_DIRECTORY) { if (type == RGUI_FILE_PLAIN) { strlcpy(type_str, "(FILE)", sizeof(type_str)); w = 6; } else if (type == RGUI_FILE_USE_DIRECTORY) { *type_str = '\0'; w = 0; } else { strlcpy(type_str, "(DIR)", sizeof(type_str)); type = RGUI_FILE_DIRECTORY; w = 5; } } else if (menu_type == RGUI_SETTINGS_OPEN_HISTORY) { *type_str = '\0'; w = 0; } else if (type >= RGUI_SETTINGS_CORE_OPTION_START) strlcpy(type_str, core_option_get_val(g_extern.system.core_options, type - RGUI_SETTINGS_CORE_OPTION_START), sizeof(type_str)); else if (driver.menu_ctx && driver.menu_ctx->backend && driver.menu_ctx->backend->setting_set_label) driver.menu_ctx->backend->setting_set_label(type_str, sizeof(type_str), &w, type); char entry_title_buf[256]; char type_str_buf[64]; bool selected = i == rgui->selection_ptr; strlcpy(entry_title_buf, path, sizeof(entry_title_buf)); strlcpy(type_str_buf, type_str, sizeof(type_str_buf)); if ((type == RGUI_FILE_PLAIN || type == RGUI_FILE_DIRECTORY)) menu_ticker_line(entry_title_buf, RMENU_TERM_WIDTH - (w + 1 + 2), g_extern.frame_count / 15, path, selected); else menu_ticker_line(type_str_buf, w, g_extern.frame_count / 15, type_str, selected); snprintf(message, sizeof(message), "%c %s", selected ? '>' : ' ', entry_title_buf); //blit_line(rgui, x, y, message, selected); font_parms.x = POSITION_EDGE_MIN + POSITION_OFFSET; font_parms.y = POSITION_EDGE_MIN + POSITION_RENDER_OFFSET + (POSITION_OFFSET * j); font_parms.scale = FONT_SIZE_NORMAL; font_parms.color = WHITE; if (driver.video_data && driver.video_poke && driver.video_poke->set_osd_msg) driver.video_poke->set_osd_msg(driver.video_data, message, &font_parms); font_parms.x = POSITION_EDGE_CENTER + POSITION_OFFSET; if (driver.video_data && driver.video_poke && driver.video_poke->set_osd_msg) driver.video_poke->set_osd_msg(driver.video_data, type_str_buf, &font_parms); } }
static int menu_action_ok(const char *menu_path, const char *menu_label, unsigned menu_type) { const char *label = NULL; const char *path = NULL; unsigned type = 0; 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); (void)hack_shader_pass; if (file_list_get_size(driver.menu->selection_buf) == 0) return 0; file_list_get_at_offset(driver.menu->selection_buf, driver.menu->selection_ptr, &path, &label, &type); #if 0 RARCH_LOG("menu label: %s\n", menu_label); RARCH_LOG("type : %d\n", type == MENU_FILE_USE_DIRECTORY); RARCH_LOG("type id : %d\n", type); #endif while (true) { switch (type) { case MENU_FILE_PLAYLIST_ENTRY: rarch_playlist_load_content(g_defaults.history, driver.menu->selection_ptr); menu_flush_stack_type(driver.menu->menu_stack, MENU_SETTINGS); return -1; #ifdef HAVE_COMPRESSION case MENU_FILE_IN_CARCHIVE: #endif case MENU_FILE_PLAIN: if (!strcmp(menu_label, "detect_core_list")) { int ret = rarch_defer_core(g_extern.core_info, menu_path, path, driver.menu->deferred_path, sizeof(driver.menu->deferred_path)); if (ret == -1) { rarch_main_command(RARCH_CMD_LOAD_CORE); menu_common_load_content(); return -1; } else if (ret == 0) menu_entries_push(driver.menu->menu_stack, g_settings.libretro_directory, "deferred_core_list", 0, driver.menu->selection_ptr); } else if ((setting && setting->type == ST_PATH)) { menu_action_setting_set_current_string_path(setting, menu_path, path); menu_entries_pop_stack(driver.menu->menu_stack, setting->name); } else if (!strcmp(menu_label, "disk_image_append")) { char image[PATH_MAX]; fill_pathname_join(image, menu_path, path, sizeof(image)); rarch_disk_control_append_image(image); rarch_main_command(RARCH_CMD_RESUME); menu_flush_stack_type(driver.menu->menu_stack,MENU_SETTINGS); return -1; } else { if (type == MENU_FILE_IN_CARCHIVE) { fill_pathname_join_delim(g_extern.fullpath, menu_path, path, '#',sizeof(g_extern.fullpath)); } else { fill_pathname_join(g_extern.fullpath, menu_path, path, sizeof(g_extern.fullpath)); } menu_common_load_content(); rarch_main_command(RARCH_CMD_LOAD_CONTENT_PERSIST); menu_flush_stack_type(driver.menu->menu_stack,MENU_SETTINGS); driver.menu->msg_force = true; return -1; } return 0; case MENU_FILE_CONFIG: { char config[PATH_MAX]; fill_pathname_join(config, menu_path, path, sizeof(config)); menu_flush_stack_type(driver.menu->menu_stack,MENU_SETTINGS); driver.menu->msg_force = true; if (rarch_replace_config(config)) { menu_clear_navigation(driver.menu); return -1; } } return 0; case MENU_FILE_FONT: case MENU_FILE_OVERLAY: case MENU_FILE_AUDIOFILTER: case MENU_FILE_VIDEOFILTER: menu_action_setting_set_current_string_path(setting, menu_path, path); menu_entries_pop_stack(driver.menu->menu_stack, setting->name); return 0; case MENU_FILE_SHADER_PRESET: #ifdef HAVE_SHADER_MANAGER { char shader_path[PATH_MAX]; fill_pathname_join(shader_path, menu_path, path, sizeof(shader_path)); menu_shader_manager_set_preset(driver.menu->shader, gfx_shader_parse_type(shader_path, RARCH_SHADER_NONE), shader_path); menu_flush_stack_label(driver.menu->menu_stack, "Shader Options"); } #endif return 0; case MENU_FILE_SHADER: #ifdef HAVE_SHADER_MANAGER fill_pathname_join(driver.menu->shader->pass[hack_shader_pass].source.path, menu_path, path, sizeof(driver.menu->shader->pass[hack_shader_pass].source.path)); /* This will reset any changed parameters. */ gfx_shader_resolve_parameters(NULL, driver.menu->shader); menu_flush_stack_label(driver.menu->menu_stack, "Shader Options"); #endif return 0; case MENU_FILE_CORE: if (!strcmp(menu_label, "deferred_core_list")) { strlcpy(g_settings.libretro, path, sizeof(g_settings.libretro)); strlcpy(g_extern.fullpath, driver.menu->deferred_path, sizeof(g_extern.fullpath)); menu_common_load_content(); return -1; } else if (!strcmp(menu_label, "core_list")) { fill_pathname_join(g_settings.libretro, menu_path, path, sizeof(g_settings.libretro)); rarch_main_command(RARCH_CMD_LOAD_CORE); menu_flush_stack_type(driver.menu->menu_stack,MENU_SETTINGS); #if defined(HAVE_DYNAMIC) /* No content needed for this core, load core immediately. */ if (driver.menu->load_no_content) { *g_extern.fullpath = '\0'; menu_common_load_content(); return -1; } /* Core selection on non-console just updates directory listing. * Will take effect on new content load. */ #elif defined(RARCH_CONSOLE) rarch_main_command(RARCH_CMD_RESTART_RETROARCH); return -1; #endif } return 0; case MENU_FILE_USE_DIRECTORY: if (setting && setting->type == ST_DIR) { menu_action_setting_set_current_string(setting, menu_path); menu_entries_pop_stack(driver.menu->menu_stack, setting->name); } return 0; case MENU_FILE_DIRECTORY: case MENU_FILE_CARCHIVE: { char cat_path[PATH_MAX]; if (type == MENU_FILE_CARCHIVE && !strcmp(menu_label, "detect_core_list")) { file_list_push(driver.menu->menu_stack, path, "load_open_zip", 0, driver.menu->selection_ptr); return 0; } fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path)); menu_entries_push(driver.menu->menu_stack, cat_path, menu_label, type, driver.menu->selection_ptr); } return 0; } break; } if (menu_parse_check(label, type) == 0) { char cat_path[PATH_MAX]; fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path)); menu_entries_push(driver.menu->menu_stack, cat_path, menu_label, type, driver.menu->selection_ptr); } return 0; }
static int menu_load_or_open_zip_iterate(unsigned action) { char msg[PATH_MAX]; snprintf(msg, sizeof(msg), "Opening compressed file\n" " \n" " - OK to open as Folder\n" " - Cancel/Back to Load \n"); if (driver.video_data && driver.menu_ctx && driver.menu_ctx->render_messagebox) { if (*msg && msg[0] != '\0') driver.menu_ctx->render_messagebox(msg); } if (action == MENU_ACTION_OK) { char cat_path[PATH_MAX]; const char *menu_path = NULL; const char *menu_label = NULL; const char* path = NULL; const char* label = NULL; unsigned int menu_type = 0, type = 0; menu_entries_pop(driver.menu->menu_stack); file_list_get_last(driver.menu->menu_stack, &menu_path, &menu_label, &menu_type); if (file_list_get_size(driver.menu->selection_buf) == 0) return 0; file_list_get_at_offset(driver.menu->selection_buf, driver.menu->selection_ptr, &path, &label, &type); fill_pathname_join(cat_path, menu_path, path, sizeof(cat_path)); menu_entries_push(driver.menu->menu_stack, cat_path, menu_label, type, driver.menu->selection_ptr); } else if (action == MENU_ACTION_CANCEL) { const char *menu_path = NULL; const char *menu_label = NULL; const char* path = NULL; const char* label = NULL; unsigned int menu_type = 0, type = 0; menu_entries_pop(driver.menu->menu_stack); file_list_get_last(driver.menu->menu_stack, &menu_path, &menu_label, &menu_type); if (file_list_get_size(driver.menu->selection_buf) == 0) return 0; file_list_get_at_offset(driver.menu->selection_buf, driver.menu->selection_ptr, &path, &label, &type); int ret = rarch_defer_core(g_extern.core_info, menu_path, path, driver.menu->deferred_path, sizeof(driver.menu->deferred_path)); if (ret == -1) { rarch_main_command(RARCH_CMD_LOAD_CORE); menu_common_load_content(); return -1; } else if (ret == 0) menu_entries_push(driver.menu->menu_stack, g_settings.libretro_directory, "deferred_core_list", 0, driver.menu->selection_ptr); } return 0; }
static int menu_settings_iterate(unsigned action) { const char *path = NULL; const char *dir = NULL; const char *label = NULL; unsigned type = 0; unsigned menu_type = 0; driver.menu->frame_buf_pitch = driver.menu->width * 2; if (action != MENU_ACTION_REFRESH) file_list_get_at_offset(driver.menu->selection_buf, driver.menu->selection_ptr, NULL, &label, &type); if (!strcmp(label, "core_list")) dir = g_settings.libretro_directory; else if (!strcmp(label, "configurations")) dir = g_settings.menu_config_directory; else if (!strcmp(label, "disk_image_append")) dir = g_settings.menu_content_directory; if (driver.menu->need_refresh && action != MENU_ACTION_MESSAGE) action = MENU_ACTION_NOOP; switch (action) { case MENU_ACTION_UP: if (driver.menu->selection_ptr > 0) menu_decrement_navigation(driver.menu); else menu_set_navigation(driver.menu, file_list_get_size(driver.menu->selection_buf) - 1); break; case MENU_ACTION_DOWN: if ((driver.menu->selection_ptr + 1) < file_list_get_size(driver.menu->selection_buf)) menu_increment_navigation(driver.menu); else menu_clear_navigation(driver.menu); break; case MENU_ACTION_CANCEL: menu_entries_pop(driver.menu->menu_stack); break; case MENU_ACTION_SELECT: file_list_push(driver.menu->menu_stack, "", "info_screen", 0, driver.menu->selection_ptr); break; case MENU_ACTION_OK: if (menu_setting_ok_toggle(type, dir, label, action) == 0) return 0; /* fall-through */ case MENU_ACTION_START: if (menu_setting_start_toggle(type, dir, label, action) == 0) return 0; /* fall-through */ case MENU_ACTION_LEFT: case MENU_ACTION_RIGHT: { int ret = menu_setting_toggle(type, dir, label, action); if (ret) return ret; } break; case MENU_ACTION_REFRESH: menu_clear_navigation(driver.menu); driver.menu->need_refresh = true; break; case MENU_ACTION_MESSAGE: driver.menu->msg_force = true; break; default: break; } file_list_get_last(driver.menu->menu_stack, &path, &label, &menu_type); if (driver.menu->need_refresh && (menu_parse_check(label, menu_type) == -1)) { driver.menu->need_refresh = false; menu_entries_push_list(driver.menu, driver.menu->selection_buf, path, label, menu_type); } if (driver.menu_ctx && driver.menu_ctx->render) driver.menu_ctx->render(); /* Have to defer it so we let settings refresh. */ if (driver.menu->push_start_screen) { driver.menu->push_start_screen = false; file_list_push(driver.menu->menu_stack, "", "help", 0, 0); } return 0; }
static void xmb_frame(void) { int i; char title_msg[64]; size_t end; const char *dir = NULL; const char *label = NULL; unsigned menu_type = 0; xmb_handle_t *xmb = (xmb_handle_t*)driver.menu->userdata; gl_t *gl = (gl_t*)driver_video_resolve(NULL); if (!xmb || !gl) return; if (driver.menu->need_refresh && g_extern.is_menu && !driver.menu->msg_force) return; update_tweens(0.002); glViewport(0, 0, gl->win_width, gl->win_height); xmb_render_background(); file_list_get_last(driver.menu->menu_stack, &dir, &label, &menu_type); get_title(label, dir, menu_type, xmb->title, sizeof(xmb->title)); xmb_draw_text(xmb->title, 30, 40, 1, 1); const char *core_name = g_extern.menu.info.library_name; if (!core_name) core_name = g_extern.system.info.library_name; if (!core_name) core_name = "No Core"; const char *core_version = g_extern.menu.info.library_version; if (!core_version) core_version = g_extern.system.info.library_version; if (!core_version) core_version = ""; snprintf(title_msg, sizeof(title_msg), "%s - %s %s", PACKAGE_VERSION, core_name, core_version); xmb_draw_text(title_msg, 30, gl->win_height - 30, 1, 1); end = file_list_get_size(driver.menu->selection_buf); for (i = 0; i < end; i++) { char value[PATH_MAX], path_buf[PATH_MAX]; const char *path = NULL, *entry_label = NULL; unsigned type = 0, w = 0; xmb_node_t *node = NULL; file_list_get_at_offset(driver.menu->selection_buf, i, &path, &entry_label, &type); node = (xmb_node_t*)file_list_get_userdata_at_offset( driver.menu->selection_buf, i); disp_set_label(&w, type, i, label, value, sizeof(value), entry_label, path, path_buf, sizeof(path_buf)); xmb_draw_icon(xmb->textures[XMB_TEXTURE_SETTING].id, xmb->margin_left + xmb->hspacing - xmb->icon_size/2.0, xmb->margin_top + node->y + xmb->icon_size/2.0, node->alpha, 0, node->zoom); xmb_draw_text(path_buf, xmb->margin_left + xmb->hspacing + xmb->label_margin_left, xmb->margin_top + node->y + xmb->label_margin_top, 1, node->alpha); xmb_draw_text(value, xmb->margin_left + xmb->hspacing + xmb->label_margin_left + xmb->setting_margin_left, xmb->margin_top + node->y + xmb->label_margin_top, 1, node->alpha); } xmb_draw_icon(xmb->textures[XMB_TEXTURE_SETTINGS].id, xmb->margin_left + xmb->hspacing - xmb->icon_size / 2.0, xmb->margin_top + xmb->icon_size / 2.0, 1.0, 0, 1.0); #ifdef GEKKO const char *message_queue; if (driver.menu->msg_force) { message_queue = msg_queue_pull(g_extern.msg_queue); driver.menu->msg_force = false; } else message_queue = driver.current_msg; xmb_render_messagebox(message_queue); #endif if (driver.menu->keyboard.display) { char msg[PATH_MAX]; const char *str = *driver.menu->keyboard.buffer; if (!str) str = ""; snprintf(msg, sizeof(msg), "%s\n%s", driver.menu->keyboard.label, str); xmb_render_messagebox(msg); } if (xmb->box_message[0] != '\0') { xmb_render_background(); xmb_render_messagebox(xmb->box_message); xmb->box_message[0] = '\0'; } gl_set_viewport(gl, gl->win_width, gl->win_height, false, false); }
void menu_entry_get(menu_entry_t *entry, size_t stack_idx, size_t i, void *userdata, bool use_representation) { char newpath[255]; const char *path = NULL; const char *entry_label = NULL; menu_file_list_cbs_t *cbs = NULL; file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(stack_idx); file_list_t *list = (userdata) ? (file_list_t*)userdata : selection_buf; newpath[0] = '\0'; if (!list) return; file_list_get_at_offset(list, i, &path, &entry_label, &entry->type, &entry->entry_idx); cbs = (menu_file_list_cbs_t*)file_list_get_actiondata_at_offset(list, i); if (cbs) { const char *label = NULL; enum msg_hash_enums enum_idx = MSG_UNKNOWN; entry->enum_idx = cbs->enum_idx; entry->checked = cbs->checked; menu_entries_get_last_stack(NULL, &label, NULL, &enum_idx, NULL); if (cbs->action_get_value && use_representation) { char tmp[255]; tmp[0] = '\0'; cbs->action_get_value(list, &entry->spacing, entry->type, (unsigned)i, label, tmp, sizeof(tmp), entry_label, path, newpath, sizeof(newpath) ); if (!string_is_empty(tmp)) entry->value = strdup(tmp); } if (cbs->action_label) { char tmp[255]; tmp[0] = '\0'; cbs->action_label(list, entry->type, (unsigned)i, label, path, tmp, sizeof(tmp)); if (!string_is_empty(tmp)) entry->rich_label = strdup(tmp); } if (cbs->action_sublabel) { char tmp[512]; tmp[0] = '\0'; cbs->action_sublabel(list, entry->type, (unsigned)i, label, path, tmp, sizeof(tmp)); if (!string_is_empty(tmp)) entry->sublabel = strdup(tmp); } } entry->idx = (unsigned)i; if (!string_is_empty(path) && !use_representation) strlcpy(newpath, path, sizeof(newpath)); else if (cbs && cbs->setting && cbs->setting->enum_value_idx != MSG_UNKNOWN && !cbs->setting->dont_use_enum_idx_representation) strlcpy(newpath, msg_hash_to_str(cbs->setting->enum_value_idx), sizeof(newpath)); if (!string_is_empty(newpath)) entry->path = strdup(newpath); if (!string_is_empty(entry_label)) entry->label = strdup(entry_label); }