From 6bc239abf72f42794c1d244f26d12d14b9062500 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Nov 2013 16:23:37 +0100 Subject: [PATCH] (RGUI) Turns rgui.c into a raster driver for common menu code - rmenu.c and rmenu_xui.cpp will need to be adapted accordingly --- frontend/menu/menu_common.c | 849 +++++++++++++++++++++++++++++++++- frontend/menu/menu_common.h | 11 +- frontend/menu/menu_context.h | 4 +- frontend/menu/rgui.c | 863 ++--------------------------------- frontend/menu/rmenu.c | 795 +++++++++++++++++++++++++++++++- frontend/menu/rmenu_xui.cpp | 6 +- frontend/menu/rmenudisp.c | 753 ------------------------------ 7 files changed, 1670 insertions(+), 1611 deletions(-) delete mode 100644 frontend/menu/rmenudisp.c diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index 3c11228667..69b1ee2cd2 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -22,6 +22,7 @@ #include #include "menu_common.h" +#include "../../gfx/gfx_common.h" #include "../../performance.h" #include "../../driver.h" #include "../../file.h" @@ -34,6 +35,17 @@ rgui_handle_t *rgui; const menu_ctx_driver_t *menu_ctx; +//forward decl +static int rgui_iterate(void *data, unsigned action); + +#if defined(HAVE_RGUI) +#define menu_iterate_func(a, b) rgui_iterate(a, b) +#elif defined(HAVE_RMENU) +#define menu_iterate_func(a, b) rmenu_iterate(a, b) +#elif defined(HAVE_RMENU_XUI) +#define menu_iterate_func(a, b) rmenu_xui_iterate(a, b) +#endif + #ifdef HAVE_SHADER_MANAGER void shader_manager_init(rgui_handle_t *rgui) { @@ -243,8 +255,8 @@ void load_menu_game_prepare(void) rgui->do_held = false; rgui->msg_force = true; - if (menu_ctx && menu_ctx->iterate) - menu_ctx->iterate(rgui, RGUI_ACTION_NOOP); + if (menu_ctx) + menu_iterate_func(rgui, RGUI_ACTION_NOOP); #endif // Draw frame for loading message @@ -529,10 +541,837 @@ static uint64_t rgui_input(void) return input_state; } +// This only makes sense for PC so far. +// Consoles use set_keybind callbacks instead. +static int rgui_custom_bind_iterate(rgui_handle_t *rgui, unsigned action) +{ + (void)action; // Have to ignore action here. Only bind that should work here is Quit RetroArch or something like that. + + if (menu_ctx && menu_ctx->render) + menu_ctx->render(rgui); + + char msg[256]; + snprintf(msg, sizeof(msg), "[%s]\npress joypad\n(RETURN to skip)", input_config_bind_map[rgui->binds.begin - RGUI_SETTINGS_BIND_BEGIN].desc); + + if (menu_ctx && menu_ctx->render_messagebox) + menu_ctx->render_messagebox(rgui, msg); + + struct rgui_bind_state binds = rgui->binds; + menu_poll_bind_state(&binds); + + if ((binds.skip && !rgui->binds.skip) || menu_poll_find_trigger(&rgui->binds, &binds)) + { + binds.begin++; + if (binds.begin <= binds.last) + binds.target++; + else + rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); + + // Avoid new binds triggering things right away. + rgui->trigger_state = 0; + rgui->old_input_state = -1ULL; + } + rgui->binds = binds; + return 0; +} + +static int rgui_start_screen_iterate(rgui_handle_t *rgui, unsigned action) +{ + if (menu_ctx && menu_ctx->render) + menu_ctx->render(rgui); + unsigned i; + char msg[1024]; + + char desc[6][64]; + static const unsigned binds[] = { + RETRO_DEVICE_ID_JOYPAD_UP, + RETRO_DEVICE_ID_JOYPAD_DOWN, + RETRO_DEVICE_ID_JOYPAD_A, + RETRO_DEVICE_ID_JOYPAD_B, + RARCH_MENU_TOGGLE, + RARCH_QUIT_KEY, + }; + + for (i = 0; i < ARRAY_SIZE(binds); i++) + { + if (driver.input && driver.input->set_keybinds) + { + struct platform_bind key_label; + strlcpy(key_label.desc, "Unknown", sizeof(key_label.desc)); + key_label.joykey = g_settings.input.binds[0][binds[i]].joykey; + driver.input->set_keybinds(&key_label, 0, 0, 0, 1ULL << KEYBINDS_ACTION_GET_BIND_LABEL); + strlcpy(desc[i], key_label.desc, sizeof(desc[i])); + } + else + { + const struct retro_keybind *bind = &g_settings.input.binds[0][binds[i]]; + input_get_bind_string(desc[i], bind, sizeof(desc[i])); + } + } + + snprintf(msg, sizeof(msg), + "-- Welcome to RetroArch / RGUI --\n" + " \n" // strtok_r doesn't split empty strings. + + "Basic RGUI controls:\n" + " Scroll (Up): %-20s\n" + " Scroll (Down): %-20s\n" + " Accept/OK: %-20s\n" + " Back: %-20s\n" + "Enter/Exit RGUI: %-20s\n" + " Exit RetroArch: %-20s\n" + " \n" + + "To play a game:\n" + "Load a libretro core (Core).\n" + "Load a ROM (Load Game). \n" + " \n" + + "See Path Options to set directories\n" + "for faster access to files.\n" + " \n" + + "Press Accept/OK to continue.", + desc[0], desc[1], desc[2], desc[3], desc[4], desc[5]); + + if (menu_ctx && menu_ctx->render_messagebox) + menu_ctx->render_messagebox(rgui, msg); + + if (action == RGUI_ACTION_OK) + rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); + return 0; +} + +static int rgui_viewport_iterate(rgui_handle_t *rgui, unsigned action) +{ + rarch_viewport_t *custom = &g_extern.console.screen.viewports.custom_vp; + + unsigned menu_type = 0; + rgui_list_get_last(rgui->menu_stack, NULL, &menu_type); + + struct retro_game_geometry *geom = &g_extern.system.av_info.geometry; + int stride_x = g_settings.video.scale_integer ? + geom->base_width : 1; + int stride_y = g_settings.video.scale_integer ? + geom->base_height : 1; + + switch (action) + { + case RGUI_ACTION_UP: + if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) + { + custom->y -= stride_y; + custom->height += stride_y; + } + else if (custom->height >= (unsigned)stride_y) + custom->height -= stride_y; + + if (driver.video_poke->apply_state_changes) + driver.video_poke->apply_state_changes(driver.video_data); + break; + + case RGUI_ACTION_DOWN: + if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) + { + custom->y += stride_y; + if (custom->height >= (unsigned)stride_y) + custom->height -= stride_y; + } + else + custom->height += stride_y; + + if (driver.video_poke->apply_state_changes) + driver.video_poke->apply_state_changes(driver.video_data); + break; + + case RGUI_ACTION_LEFT: + if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) + { + custom->x -= stride_x; + custom->width += stride_x; + } + else if (custom->width >= (unsigned)stride_x) + custom->width -= stride_x; + + if (driver.video_poke->apply_state_changes) + driver.video_poke->apply_state_changes(driver.video_data); + break; + + case RGUI_ACTION_RIGHT: + if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) + { + custom->x += stride_x; + if (custom->width >= (unsigned)stride_x) + custom->width -= stride_x; + } + else + custom->width += stride_x; + + if (driver.video_poke->apply_state_changes) + driver.video_poke->apply_state_changes(driver.video_data); + break; + + case RGUI_ACTION_CANCEL: + rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); + if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2) + { + rgui_list_push(rgui->menu_stack, "", + RGUI_SETTINGS_CUSTOM_VIEWPORT, + rgui->selection_ptr); + } + break; + + case RGUI_ACTION_OK: + rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); + if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT + && !g_settings.video.scale_integer) + { + rgui_list_push(rgui->menu_stack, "", + RGUI_SETTINGS_CUSTOM_VIEWPORT_2, + rgui->selection_ptr); + } + break; + + case RGUI_ACTION_START: + if (!g_settings.video.scale_integer) + { + rarch_viewport_t vp; + driver.video->viewport_info(driver.video_data, &vp); + + if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) + { + custom->width += custom->x; + custom->height += custom->y; + custom->x = 0; + custom->y = 0; + } + else + { + custom->width = vp.full_width - custom->x; + custom->height = vp.full_height - custom->y; + } + + if (driver.video_poke->apply_state_changes) + driver.video_poke->apply_state_changes(driver.video_data); + } + break; + + case RGUI_ACTION_MESSAGE: + rgui->msg_force = true; + break; + + default: + break; + } + + rgui_list_get_last(rgui->menu_stack, NULL, &menu_type); + + if (menu_ctx && menu_ctx->render) + menu_ctx->render(rgui); + + const char *base_msg = NULL; + char msg[64]; + + if (g_settings.video.scale_integer) + { + custom->x = 0; + custom->y = 0; + custom->width = ((custom->width + geom->base_width - 1) / geom->base_width) * geom->base_width; + custom->height = ((custom->height + geom->base_height - 1) / geom->base_height) * geom->base_height; + + base_msg = "Set scale"; + snprintf(msg, sizeof(msg), "%s (%4ux%4u, %u x %u scale)", + base_msg, + custom->width, custom->height, + custom->width / geom->base_width, + custom->height / geom->base_height); + } + else + { + if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) + base_msg = "Set Upper-Left Corner"; + else if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2) + base_msg = "Set Bottom-Right Corner"; + + snprintf(msg, sizeof(msg), "%s (%d, %d : %4ux%4u)", + base_msg, custom->x, custom->y, custom->width, custom->height); + } + + if (menu_ctx && menu_ctx->render_messagebox) + menu_ctx->render_messagebox(rgui, msg); + + if (!custom->width) + custom->width = stride_x; + if (!custom->height) + custom->height = stride_y; + + aspectratio_lut[ASPECT_RATIO_CUSTOM].value = + (float)custom->width / custom->height; + + if (driver.video_poke->apply_state_changes) + driver.video_poke->apply_state_changes(driver.video_data); + + return 0; +} + +static int rgui_settings_iterate(rgui_handle_t *rgui, unsigned action) +{ + rgui->frame_buf_pitch = rgui->width * 2; + unsigned type = 0; + const char *label = NULL; + if (action != RGUI_ACTION_REFRESH) + rgui_list_get_at_offset(rgui->selection_buf, rgui->selection_ptr, &label, &type); + + if (type == RGUI_SETTINGS_CORE) + { +#if defined(HAVE_DYNAMIC) + label = rgui->libretro_dir; +#elif defined(HAVE_LIBRETRO_MANAGEMENT) + label = default_paths.core_dir; +#else + label = ""; // Shouldn't happen ... +#endif + } + else if (type == RGUI_SETTINGS_CONFIG) + label = g_settings.rgui_config_directory; + else if (type == RGUI_SETTINGS_DISK_APPEND) + label = rgui->base_path; + + const char *dir = NULL; + unsigned menu_type = 0; + rgui_list_get_last(rgui->menu_stack, &dir, &menu_type); + + if (rgui->need_refresh) + action = RGUI_ACTION_NOOP; + + switch (action) + { + case RGUI_ACTION_UP: + if (rgui->selection_ptr > 0) + rgui->selection_ptr--; + else + rgui->selection_ptr = rgui->selection_buf->size - 1; + break; + + case RGUI_ACTION_DOWN: + if (rgui->selection_ptr + 1 < rgui->selection_buf->size) + rgui->selection_ptr++; + else + rgui->selection_ptr = 0; + break; + + case RGUI_ACTION_CANCEL: + if (rgui->menu_stack->size > 1) + { + rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); + rgui->need_refresh = true; + } + break; + + case RGUI_ACTION_LEFT: + case RGUI_ACTION_RIGHT: + case RGUI_ACTION_OK: + case RGUI_ACTION_START: + if ((type == RGUI_SETTINGS_OPEN_FILEBROWSER || type == RGUI_SETTINGS_OPEN_FILEBROWSER_DEFERRED_CORE) + && action == RGUI_ACTION_OK) + { + rgui->defer_core = type == RGUI_SETTINGS_OPEN_FILEBROWSER_DEFERRED_CORE; + rgui_list_push(rgui->menu_stack, rgui->base_path, RGUI_FILE_DIRECTORY, rgui->selection_ptr); + rgui->selection_ptr = 0; + rgui->need_refresh = true; + } + else if ((type == RGUI_SETTINGS_OPEN_HISTORY || menu_type_is(type) == RGUI_FILE_DIRECTORY) && action == RGUI_ACTION_OK) + { + rgui_list_push(rgui->menu_stack, "", type, rgui->selection_ptr); + rgui->selection_ptr = 0; + rgui->need_refresh = true; + } + else if ((menu_type_is(type) == RGUI_SETTINGS || type == RGUI_SETTINGS_CORE || type == RGUI_SETTINGS_CONFIG || type == RGUI_SETTINGS_DISK_APPEND) && action == RGUI_ACTION_OK) + { + rgui_list_push(rgui->menu_stack, label, type, rgui->selection_ptr); + rgui->selection_ptr = 0; + rgui->need_refresh = true; + } + else if (type == RGUI_SETTINGS_CUSTOM_VIEWPORT && action == RGUI_ACTION_OK) + { + rgui_list_push(rgui->menu_stack, "", type, rgui->selection_ptr); + + // Start with something sane. + rarch_viewport_t *custom = &g_extern.console.screen.viewports.custom_vp; + driver.video->viewport_info(driver.video_data, custom); + aspectratio_lut[ASPECT_RATIO_CUSTOM].value = + (float)custom->width / custom->height; + + g_settings.video.aspect_ratio_idx = ASPECT_RATIO_CUSTOM; + if (driver.video_poke->set_aspect_ratio) + driver.video_poke->set_aspect_ratio(driver.video_data, + g_settings.video.aspect_ratio_idx); + } + else + { + int ret = rgui_settings_toggle_setting(rgui, type, action, menu_type); + if (ret) + return ret; + } + break; + + case RGUI_ACTION_REFRESH: + rgui->selection_ptr = 0; + rgui->need_refresh = true; + break; + + case RGUI_ACTION_MESSAGE: + rgui->msg_force = true; + break; + + default: + break; + } + + rgui_list_get_last(rgui->menu_stack, &dir, &menu_type); + + if (rgui->need_refresh && !(menu_type == RGUI_FILE_DIRECTORY || + menu_type_is(menu_type) == RGUI_SETTINGS_SHADER_OPTIONS|| + menu_type_is(menu_type) == RGUI_FILE_DIRECTORY || + menu_type == RGUI_SETTINGS_OVERLAY_PRESET || + menu_type == RGUI_SETTINGS_CORE || + menu_type == RGUI_SETTINGS_CONFIG || + menu_type == RGUI_SETTINGS_DISK_APPEND || + menu_type == RGUI_SETTINGS_OPEN_HISTORY)) + { + rgui->need_refresh = false; + if ( + menu_type == RGUI_SETTINGS_INPUT_OPTIONS + || menu_type == RGUI_SETTINGS_PATH_OPTIONS + || menu_type == RGUI_SETTINGS_OPTIONS + || menu_type == RGUI_SETTINGS_DRIVERS + || menu_type == RGUI_SETTINGS_CORE_OPTIONS + || menu_type == RGUI_SETTINGS_AUDIO_OPTIONS + || menu_type == RGUI_SETTINGS_DISK_OPTIONS + || menu_type == RGUI_SETTINGS_VIDEO_OPTIONS + || menu_type == RGUI_SETTINGS_SHADER_OPTIONS + ) + menu_populate_entries(rgui, menu_type); + else + menu_populate_entries(rgui, RGUI_SETTINGS); + } + + if (menu_ctx && menu_ctx->render) + menu_ctx->render(rgui); + + // Have to defer it so we let settings refresh. + if (rgui->push_start_screen) + { + rgui->push_start_screen = false; + rgui_list_push(rgui->menu_stack, "", RGUI_START_SCREEN, 0); + } + + return 0; +} + +static inline void rgui_descend_alphabet(rgui_handle_t *rgui, size_t *ptr_out) +{ + if (!rgui->scroll_indices_size) + return; + size_t ptr = *ptr_out; + if (ptr == 0) + return; + size_t i = rgui->scroll_indices_size - 1; + while (i && rgui->scroll_indices[i - 1] >= ptr) + i--; + *ptr_out = rgui->scroll_indices[i - 1]; +} + +static inline void rgui_ascend_alphabet(rgui_handle_t *rgui, size_t *ptr_out) +{ + if (!rgui->scroll_indices_size) + return; + size_t ptr = *ptr_out; + if (ptr == rgui->scroll_indices[rgui->scroll_indices_size - 1]) + return; + size_t i = 0; + while (i < rgui->scroll_indices_size - 1 && rgui->scroll_indices[i + 1] <= ptr) + i++; + *ptr_out = rgui->scroll_indices[i + 1]; +} + +static void rgui_flush_menu_stack_type(rgui_handle_t *rgui, unsigned final_type) +{ + unsigned type; + type = 0; + rgui->need_refresh = true; + rgui_list_get_last(rgui->menu_stack, NULL, &type); + while (type != final_type) + { + rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); + rgui_list_get_last(rgui->menu_stack, NULL, &type); + } +} + +static int rgui_iterate(void *data, unsigned action) +{ + rgui_handle_t *rgui = (rgui_handle_t*)data; + + const char *dir = 0; + unsigned menu_type = 0; + rgui_list_get_last(rgui->menu_stack, &dir, &menu_type); + int ret = 0; + + if (menu_ctx && menu_ctx->set_texture) + menu_ctx->set_texture(rgui, false); + + if (menu_type == RGUI_START_SCREEN) + return rgui_start_screen_iterate(rgui, action); + else if (menu_type_is(menu_type) == RGUI_SETTINGS) + return rgui_settings_iterate(rgui, action); + else if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT || menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2) + return rgui_viewport_iterate(rgui, action); + else if (menu_type == RGUI_SETTINGS_CUSTOM_BIND) + return rgui_custom_bind_iterate(rgui, action); + + if (rgui->need_refresh && action != RGUI_ACTION_MESSAGE) + action = RGUI_ACTION_NOOP; + + unsigned scroll_speed = (max(rgui->scroll_accel, 2) - 2) / 4 + 1; + unsigned fast_scroll_speed = 4 + 4 * scroll_speed; + + switch (action) + { + case RGUI_ACTION_UP: + if (rgui->selection_ptr >= scroll_speed) + rgui->selection_ptr -= scroll_speed; + else + rgui->selection_ptr = rgui->selection_buf->size - 1; + break; + + case RGUI_ACTION_DOWN: + if (rgui->selection_ptr + scroll_speed < rgui->selection_buf->size) + rgui->selection_ptr += scroll_speed; + else + rgui->selection_ptr = 0; + break; + + case RGUI_ACTION_LEFT: + if (rgui->selection_ptr > fast_scroll_speed) + rgui->selection_ptr -= fast_scroll_speed; + else + rgui->selection_ptr = 0; + break; + + case RGUI_ACTION_RIGHT: + if (rgui->selection_ptr + fast_scroll_speed < rgui->selection_buf->size) + rgui->selection_ptr += fast_scroll_speed; + else + rgui->selection_ptr = rgui->selection_buf->size - 1; + break; + + case RGUI_ACTION_SCROLL_UP: + rgui_descend_alphabet(rgui, &rgui->selection_ptr); + break; + case RGUI_ACTION_SCROLL_DOWN: + rgui_ascend_alphabet(rgui, &rgui->selection_ptr); + break; + + case RGUI_ACTION_CANCEL: + if (rgui->menu_stack->size > 1) + { + rgui->need_refresh = true; + rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); + } + break; + + case RGUI_ACTION_OK: + { + if (rgui->selection_buf->size == 0) + return 0; + + const char *path = 0; + unsigned type = 0; + rgui_list_get_at_offset(rgui->selection_buf, rgui->selection_ptr, &path, &type); + + if ( + menu_type_is(type) == RGUI_SETTINGS_SHADER_OPTIONS || + menu_type_is(type) == RGUI_FILE_DIRECTORY || + type == RGUI_SETTINGS_OVERLAY_PRESET || + type == RGUI_SETTINGS_CORE || + type == RGUI_SETTINGS_CONFIG || + type == RGUI_SETTINGS_DISK_APPEND || + type == RGUI_FILE_DIRECTORY) + { + char cat_path[PATH_MAX]; + fill_pathname_join(cat_path, dir, path, sizeof(cat_path)); + + rgui_list_push(rgui->menu_stack, cat_path, type, rgui->selection_ptr); + rgui->selection_ptr = 0; + rgui->need_refresh = true; + } + else + { +#ifdef HAVE_SHADER_MANAGER + if (menu_type_is(menu_type) == RGUI_SETTINGS_SHADER_OPTIONS) + { + if (menu_type == RGUI_SETTINGS_SHADER_PRESET) + { + char shader_path[PATH_MAX]; + fill_pathname_join(shader_path, dir, path, sizeof(shader_path)); + shader_manager_set_preset(&rgui->shader, gfx_shader_parse_type(shader_path, RARCH_SHADER_NONE), + shader_path); + } + else + { + unsigned pass = (menu_type - RGUI_SETTINGS_SHADER_0) / 3; + fill_pathname_join(rgui->shader.pass[pass].source.cg, + dir, path, sizeof(rgui->shader.pass[pass].source.cg)); + } + + // Pop stack until we hit shader manager again. + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_SHADER_OPTIONS); + } + else +#endif + if (menu_type == RGUI_SETTINGS_DEFERRED_CORE) + { + // FIXME: Add for consoles. + strlcpy(g_settings.libretro, path, sizeof(g_settings.libretro)); + strlcpy(g_extern.fullpath, rgui->deferred_path, sizeof(g_extern.fullpath)); +#ifdef HAVE_DYNAMIC + libretro_free_system_info(&rgui->info); + libretro_get_system_info(g_settings.libretro, &rgui->info, + &rgui->load_no_rom); + + g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME); +#else + rarch_environment_cb(RETRO_ENVIRONMENT_SET_LIBRETRO_PATH, (void*)g_settings.libretro); + rarch_environment_cb(RETRO_ENVIRONMENT_EXEC, (void*)g_extern.fullpath); +#endif + rgui->msg_force = true; + ret = -1; + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); + } + else if (menu_type == RGUI_SETTINGS_CORE) + { +#if defined(HAVE_DYNAMIC) + fill_pathname_join(g_settings.libretro, dir, path, sizeof(g_settings.libretro)); + libretro_free_system_info(&rgui->info); + libretro_get_system_info(g_settings.libretro, &rgui->info, + &rgui->load_no_rom); + + // No ROM needed for this core, load game immediately. + if (rgui->load_no_rom) + { + g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME); + *g_extern.fullpath = '\0'; + rgui->msg_force = true; + ret = -1; + } + + // Core selection on non-console just updates directory listing. + // Will take affect on new ROM load. +#elif defined(GEKKO) && defined(HW_RVL) + rarch_environment_cb(RETRO_ENVIRONMENT_SET_LIBRETRO_PATH, (void*)path); + + fill_pathname_join(g_extern.fullpath, default_paths.core_dir, + SALAMANDER_FILE, sizeof(g_extern.fullpath)); + g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME); + g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN); + ret = -1; +#endif + + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); + } + else if (menu_type == RGUI_SETTINGS_CONFIG) + { + char config[PATH_MAX]; + fill_pathname_join(config, dir, path, sizeof(config)); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); + rgui->msg_force = true; + if (menu_replace_config(config)) + { + rgui->selection_ptr = 0; // Menu can shrink. + ret = -1; + } + } +#ifdef HAVE_OVERLAY + else if (menu_type == RGUI_SETTINGS_OVERLAY_PRESET) + { + fill_pathname_join(g_settings.input.overlay, dir, path, sizeof(g_settings.input.overlay)); + + if (driver.overlay) + input_overlay_free(driver.overlay); + driver.overlay = input_overlay_new(g_settings.input.overlay); + if (!driver.overlay) + RARCH_ERR("Failed to load overlay.\n"); + + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_INPUT_OPTIONS); + } +#endif + else if (menu_type == RGUI_SETTINGS_DISK_APPEND) + { + char image[PATH_MAX]; + fill_pathname_join(image, dir, path, sizeof(image)); + rarch_disk_control_append_image(image); + + g_extern.lifecycle_mode_state |= 1ULL << MODE_GAME; + + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); + ret = -1; + } + else if (menu_type == RGUI_SETTINGS_OPEN_HISTORY) + { + load_menu_game_history(rgui->selection_ptr); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); + ret = -1; + } + else if (menu_type == RGUI_BROWSER_DIR_PATH) + { + strlcpy(g_settings.rgui_browser_directory, dir, sizeof(g_settings.rgui_browser_directory)); + strlcpy(rgui->base_path, dir, sizeof(rgui->base_path)); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); + } +#ifdef HAVE_SCREENSHOTS + else if (menu_type == RGUI_SCREENSHOT_DIR_PATH) + { + strlcpy(g_settings.screenshot_directory, dir, sizeof(g_settings.screenshot_directory)); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); + } +#endif + else if (menu_type == RGUI_SAVEFILE_DIR_PATH) + { + strlcpy(g_extern.savefile_dir, dir, sizeof(g_extern.savefile_dir)); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); + } +#ifdef HAVE_OVERLAY + else if (menu_type == RGUI_OVERLAY_DIR_PATH) + { + strlcpy(g_extern.overlay_dir, dir, sizeof(g_extern.overlay_dir)); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); + } +#endif + else if (menu_type == RGUI_SAVESTATE_DIR_PATH) + { + strlcpy(g_extern.savestate_dir, dir, sizeof(g_extern.savestate_dir)); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); + } +#ifdef HAVE_DYNAMIC + else if (menu_type == RGUI_LIBRETRO_DIR_PATH) + { + strlcpy(rgui->libretro_dir, dir, sizeof(rgui->libretro_dir)); + menu_init_core_info(rgui); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); + } + else if (menu_type == RGUI_CONFIG_DIR_PATH) + { + strlcpy(g_settings.rgui_config_directory, dir, sizeof(g_settings.rgui_config_directory)); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); + } +#endif + else if (menu_type == RGUI_LIBRETRO_INFO_DIR_PATH) + { + strlcpy(g_settings.libretro_info_path, dir, sizeof(g_settings.libretro_info_path)); + menu_init_core_info(rgui); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); + } + else if (menu_type == RGUI_SHADER_DIR_PATH) + { + strlcpy(g_settings.video.shader_dir, dir, sizeof(g_settings.video.shader_dir)); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); + } + else if (menu_type == RGUI_SYSTEM_DIR_PATH) + { + strlcpy(g_settings.system_directory, dir, sizeof(g_settings.system_directory)); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); + } + else + { + if (rgui->defer_core) + { + fill_pathname_join(rgui->deferred_path, dir, path, sizeof(rgui->deferred_path)); + + const core_info_t *info = NULL; + size_t supported = 0; + if (rgui->core_info) + core_info_list_get_supported_cores(rgui->core_info, rgui->deferred_path, &info, &supported); + + if (supported == 1) // Can make a decision right now. + { + strlcpy(g_extern.fullpath, rgui->deferred_path, sizeof(g_extern.fullpath)); + strlcpy(g_settings.libretro, info->path, sizeof(g_settings.libretro)); + +#ifdef HAVE_DYNAMIC + libretro_free_system_info(&rgui->info); + libretro_get_system_info(g_settings.libretro, &rgui->info, + &rgui->load_no_rom); +#else + rarch_environment_cb(RETRO_ENVIRONMENT_SET_LIBRETRO_PATH, (void*)g_settings.libretro); + rarch_environment_cb(RETRO_ENVIRONMENT_EXEC, (void*)g_extern.fullpath); +#endif + + g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME); + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); + rgui->msg_force = true; + ret = -1; + } + else // Present a selection. + { + rgui_list_push(rgui->menu_stack, rgui->libretro_dir, RGUI_SETTINGS_DEFERRED_CORE, rgui->selection_ptr); + rgui->selection_ptr = 0; + rgui->need_refresh = true; + } + } + else + { + fill_pathname_join(g_extern.fullpath, dir, path, sizeof(g_extern.fullpath)); + g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME); + + rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); + rgui->msg_force = true; + ret = -1; + } + } + } + break; + } + + case RGUI_ACTION_REFRESH: + rgui->selection_ptr = 0; + rgui->need_refresh = true; + break; + + case RGUI_ACTION_MESSAGE: + rgui->msg_force = true; + break; + + default: + break; + } + + // refresh values in case the stack changed + rgui_list_get_last(rgui->menu_stack, &dir, &menu_type); + + if (rgui->need_refresh && (menu_type == RGUI_FILE_DIRECTORY || + menu_type_is(menu_type) == RGUI_SETTINGS_SHADER_OPTIONS || + menu_type_is(menu_type) == RGUI_FILE_DIRECTORY || + menu_type == RGUI_SETTINGS_OVERLAY_PRESET || + menu_type == RGUI_SETTINGS_DEFERRED_CORE || + menu_type == RGUI_SETTINGS_CORE || + menu_type == RGUI_SETTINGS_CONFIG || + menu_type == RGUI_SETTINGS_OPEN_HISTORY || + menu_type == RGUI_SETTINGS_DISK_APPEND)) + { + rgui->need_refresh = false; + menu_parse_and_resolve(rgui, menu_type); + } + + if (menu_ctx && menu_ctx->render) + menu_ctx->render(rgui); + + return ret; +} + bool menu_iterate(void) { rarch_time_t time, delta, target_msec, sleep_msec; - rgui_action_t action; + unsigned action; static bool initial_held = true; static bool first_held = false; uint64_t input_state = 0; @@ -608,8 +1447,8 @@ bool menu_iterate(void) else if (rgui->trigger_state & (1ULL << RETRO_DEVICE_ID_JOYPAD_START)) action = RGUI_ACTION_START; - if (menu_ctx && menu_ctx->iterate) - input_entry_ret = menu_ctx->iterate(rgui, action); + if (menu_ctx) + input_entry_ret = menu_iterate_func(rgui, action); if (driver.video_poke && driver.video_poke->set_texture_enable) driver.video_poke->set_texture_enable(driver.video_data, rgui->frame_buf_show, MENU_TEXTURE_FULLSCREEN); diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index 628b89b0e2..43b0ff4ef9 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -273,6 +273,9 @@ typedef struct unsigned delay_timer; unsigned delay_count; + unsigned width; + unsigned height; + uint16_t *frame_buf; size_t frame_buf_pitch; bool frame_buf_show; @@ -332,6 +335,12 @@ void menu_init(void); bool menu_iterate(void); void menu_free(void); +#if defined(HAVE_RMENU) +int rmenu_iterate(void *data, unsigned action); +#elif defined(HAVE_RMENU_XUI) +int rmenu_xui_iterate(void *data, unsigned action); +#endif + #if defined(HAVE_RGUI) || defined(HAVE_RMENU) || defined(HAVE_RMENU_XUI) int rgui_input_postprocess(void *data, uint64_t old_state); #endif @@ -361,7 +370,7 @@ bool menu_replace_config(const char *path); bool menu_save_new_config(void); -int rgui_settings_toggle_setting(rgui_handle_t *rgui, unsigned setting, rgui_action_t action, unsigned menu_type); +int rgui_settings_toggle_setting(rgui_handle_t *rgui, unsigned setting, unsigned action, unsigned menu_type); int menu_set_settings(unsigned setting, unsigned action); void menu_set_settings_label(char *type_str, size_t type_str_size, unsigned *w, unsigned type); diff --git a/frontend/menu/menu_context.h b/frontend/menu/menu_context.h index 6575b59983..7d53c9e179 100644 --- a/frontend/menu/menu_context.h +++ b/frontend/menu/menu_context.h @@ -28,7 +28,9 @@ typedef struct menu_ctx_driver { - int (*iterate)(void*, unsigned); + void (*set_texture)(void*, bool); + void (*render_messagebox)(void*, const char*); + void (*render)(void*); void* (*init)(void); void (*free)(void*); diff --git a/frontend/menu/rgui.c b/frontend/menu/rgui.c index c0ec484943..575a68f488 100644 --- a/frontend/menu/rgui.c +++ b/frontend/menu/rgui.c @@ -45,27 +45,12 @@ #define HAVE_SHADER_MANAGER #endif -static unsigned RGUI_WIDTH = 320; -static unsigned RGUI_HEIGHT = 240; static uint16_t menu_framebuf[400 * 240]; #define TERM_START_X 15 #define TERM_START_Y 27 -#define TERM_WIDTH (((RGUI_WIDTH - TERM_START_X - 15) / (FONT_WIDTH_STRIDE))) -#define TERM_HEIGHT (((RGUI_HEIGHT - TERM_START_Y - 15) / (FONT_HEIGHT_STRIDE)) - 1) - -static void rgui_flush_menu_stack_type(rgui_handle_t *rgui, unsigned final_type) -{ - unsigned type; - type = 0; - rgui->need_refresh = true; - rgui_list_get_last(rgui->menu_stack, NULL, &type); - while (type != final_type) - { - rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); - rgui_list_get_last(rgui->menu_stack, NULL, &type); - } -} +#define TERM_WIDTH (((rgui->width - TERM_START_X - 15) / (FONT_WIDTH_STRIDE))) +#define TERM_HEIGHT (((rgui->height - TERM_START_Y - 15) / (FONT_HEIGHT_STRIDE)) - 1) static void rgui_copy_glyph(uint8_t *glyph, const uint8_t *buf) { @@ -191,23 +176,24 @@ static bool rguidisp_init_font(void *data) static void render_background(rgui_handle_t *rgui) { fill_rect(rgui->frame_buf, rgui->frame_buf_pitch, - 0, 0, RGUI_WIDTH, RGUI_HEIGHT, gray_filler); + 0, 0, rgui->width, rgui->height, gray_filler); fill_rect(rgui->frame_buf, rgui->frame_buf_pitch, - 5, 5, RGUI_WIDTH - 10, 5, green_filler); + 5, 5, rgui->width - 10, 5, green_filler); fill_rect(rgui->frame_buf, rgui->frame_buf_pitch, - 5, RGUI_HEIGHT - 10, RGUI_WIDTH - 10, 5, green_filler); + 5, rgui->height - 10, rgui->width - 10, 5, green_filler); fill_rect(rgui->frame_buf, rgui->frame_buf_pitch, - 5, 5, 5, RGUI_HEIGHT - 10, green_filler); + 5, 5, 5, rgui->height - 10, green_filler); fill_rect(rgui->frame_buf, rgui->frame_buf_pitch, - RGUI_WIDTH - 10, 5, 5, RGUI_HEIGHT - 10, green_filler); + rgui->width - 10, 5, 5, rgui->height - 10, green_filler); } -static void render_messagebox(rgui_handle_t *rgui, const char *message) +static void rgui_render_messagebox(void *data, const char *message) { + rgui_handle_t *rgui = (rgui_handle_t*)data; size_t i; if (!message || !*message) @@ -243,8 +229,8 @@ static void render_messagebox(rgui_handle_t *rgui, const char *message) } unsigned height = FONT_HEIGHT_STRIDE * list->size + 6 + 10; - int x = (RGUI_WIDTH - width) / 2; - int y = (RGUI_HEIGHT - height) / 2; + int x = (rgui->width - width) / 2; + int y = (rgui->height - height) / 2; fill_rect(rgui->frame_buf, rgui->frame_buf_pitch, x + 5, y + 5, width - 10, height - 10, gray_filler); @@ -272,7 +258,7 @@ static void render_messagebox(rgui_handle_t *rgui, const char *message) string_list_free(list); } -static void render_text(void *data) +static void rgui_render(void *data) { rgui_handle_t *rgui = (rgui_handle_t*)data; @@ -533,11 +519,15 @@ static void render_text(void *data) static void *rgui_init(void) { uint16_t *framebuf = menu_framebuf; - size_t framebuf_pitch = RGUI_WIDTH * sizeof(uint16_t); + size_t framebuf_pitch; rgui_handle_t *rgui = (rgui_handle_t*)calloc(1, sizeof(*rgui)); rgui->frame_buf = framebuf; + rgui->width = 320; + rgui->height = 240; + framebuf_pitch = rgui->width * sizeof(uint16_t); + rgui->frame_buf_pitch = framebuf_pitch; bool ret = rguidisp_init_font(rgui); @@ -561,812 +551,6 @@ static void rgui_free(void *data) free((uint8_t*)rgui->font); } -// This only makes sense for PC so far. -// Consoles use set_keybind callbacks instead. -static int rgui_custom_bind_iterate(rgui_handle_t *rgui, rgui_action_t action) -{ - (void)action; // Have to ignore action here. Only bind that should work here is Quit RetroArch or something like that. - - render_text(rgui); - - char msg[256]; - snprintf(msg, sizeof(msg), "[%s]\npress joypad\n(RETURN to skip)", input_config_bind_map[rgui->binds.begin - RGUI_SETTINGS_BIND_BEGIN].desc); - render_messagebox(rgui, msg); - - struct rgui_bind_state binds = rgui->binds; - menu_poll_bind_state(&binds); - - if ((binds.skip && !rgui->binds.skip) || menu_poll_find_trigger(&rgui->binds, &binds)) - { - binds.begin++; - if (binds.begin <= binds.last) - binds.target++; - else - rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); - - // Avoid new binds triggering things right away. - rgui->trigger_state = 0; - rgui->old_input_state = -1ULL; - } - rgui->binds = binds; - return 0; -} - -static int rgui_start_screen_iterate(rgui_handle_t *rgui, rgui_action_t action) -{ - render_text(rgui); - unsigned i; - char msg[1024]; - - char desc[6][64]; - static const unsigned binds[] = { - RETRO_DEVICE_ID_JOYPAD_UP, - RETRO_DEVICE_ID_JOYPAD_DOWN, - RETRO_DEVICE_ID_JOYPAD_A, - RETRO_DEVICE_ID_JOYPAD_B, - RARCH_MENU_TOGGLE, - RARCH_QUIT_KEY, - }; - - for (i = 0; i < ARRAY_SIZE(binds); i++) - { - if (driver.input && driver.input->set_keybinds) - { - struct platform_bind key_label; - strlcpy(key_label.desc, "Unknown", sizeof(key_label.desc)); - key_label.joykey = g_settings.input.binds[0][binds[i]].joykey; - driver.input->set_keybinds(&key_label, 0, 0, 0, 1ULL << KEYBINDS_ACTION_GET_BIND_LABEL); - strlcpy(desc[i], key_label.desc, sizeof(desc[i])); - } - else - { - const struct retro_keybind *bind = &g_settings.input.binds[0][binds[i]]; - input_get_bind_string(desc[i], bind, sizeof(desc[i])); - } - } - - snprintf(msg, sizeof(msg), - "-- Welcome to RetroArch / RGUI --\n" - " \n" // strtok_r doesn't split empty strings. - - "Basic RGUI controls:\n" - " Scroll (Up): %-20s\n" - " Scroll (Down): %-20s\n" - " Accept/OK: %-20s\n" - " Back: %-20s\n" - "Enter/Exit RGUI: %-20s\n" - " Exit RetroArch: %-20s\n" - " \n" - - "To play a game:\n" - "Load a libretro core (Core).\n" - "Load a ROM (Load Game). \n" - " \n" - - "See Path Options to set directories\n" - "for faster access to files.\n" - " \n" - - "Press Accept/OK to continue.", - desc[0], desc[1], desc[2], desc[3], desc[4], desc[5]); - - render_messagebox(rgui, msg); - - if (action == RGUI_ACTION_OK) - rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); - return 0; -} - -static int rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action) -{ - rarch_viewport_t *custom = &g_extern.console.screen.viewports.custom_vp; - - unsigned menu_type = 0; - rgui_list_get_last(rgui->menu_stack, NULL, &menu_type); - - struct retro_game_geometry *geom = &g_extern.system.av_info.geometry; - int stride_x = g_settings.video.scale_integer ? - geom->base_width : 1; - int stride_y = g_settings.video.scale_integer ? - geom->base_height : 1; - - switch (action) - { - case RGUI_ACTION_UP: - if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) - { - custom->y -= stride_y; - custom->height += stride_y; - } - else if (custom->height >= (unsigned)stride_y) - custom->height -= stride_y; - - if (driver.video_poke->apply_state_changes) - driver.video_poke->apply_state_changes(driver.video_data); - break; - - case RGUI_ACTION_DOWN: - if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) - { - custom->y += stride_y; - if (custom->height >= (unsigned)stride_y) - custom->height -= stride_y; - } - else - custom->height += stride_y; - - if (driver.video_poke->apply_state_changes) - driver.video_poke->apply_state_changes(driver.video_data); - break; - - case RGUI_ACTION_LEFT: - if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) - { - custom->x -= stride_x; - custom->width += stride_x; - } - else if (custom->width >= (unsigned)stride_x) - custom->width -= stride_x; - - if (driver.video_poke->apply_state_changes) - driver.video_poke->apply_state_changes(driver.video_data); - break; - - case RGUI_ACTION_RIGHT: - if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) - { - custom->x += stride_x; - if (custom->width >= (unsigned)stride_x) - custom->width -= stride_x; - } - else - custom->width += stride_x; - - if (driver.video_poke->apply_state_changes) - driver.video_poke->apply_state_changes(driver.video_data); - break; - - case RGUI_ACTION_CANCEL: - rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); - if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2) - { - rgui_list_push(rgui->menu_stack, "", - RGUI_SETTINGS_CUSTOM_VIEWPORT, - rgui->selection_ptr); - } - break; - - case RGUI_ACTION_OK: - rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); - if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT - && !g_settings.video.scale_integer) - { - rgui_list_push(rgui->menu_stack, "", - RGUI_SETTINGS_CUSTOM_VIEWPORT_2, - rgui->selection_ptr); - } - break; - - case RGUI_ACTION_START: - if (!g_settings.video.scale_integer) - { - rarch_viewport_t vp; - driver.video->viewport_info(driver.video_data, &vp); - - if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) - { - custom->width += custom->x; - custom->height += custom->y; - custom->x = 0; - custom->y = 0; - } - else - { - custom->width = vp.full_width - custom->x; - custom->height = vp.full_height - custom->y; - } - - if (driver.video_poke->apply_state_changes) - driver.video_poke->apply_state_changes(driver.video_data); - } - break; - - case RGUI_ACTION_MESSAGE: - rgui->msg_force = true; - break; - - default: - break; - } - - rgui_list_get_last(rgui->menu_stack, NULL, &menu_type); - - render_text(rgui); - - const char *base_msg = NULL; - char msg[64]; - - if (g_settings.video.scale_integer) - { - custom->x = 0; - custom->y = 0; - custom->width = ((custom->width + geom->base_width - 1) / geom->base_width) * geom->base_width; - custom->height = ((custom->height + geom->base_height - 1) / geom->base_height) * geom->base_height; - - base_msg = "Set scale"; - snprintf(msg, sizeof(msg), "%s (%4ux%4u, %u x %u scale)", - base_msg, - custom->width, custom->height, - custom->width / geom->base_width, - custom->height / geom->base_height); - } - else - { - if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) - base_msg = "Set Upper-Left Corner"; - else if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2) - base_msg = "Set Bottom-Right Corner"; - - snprintf(msg, sizeof(msg), "%s (%d, %d : %4ux%4u)", - base_msg, custom->x, custom->y, custom->width, custom->height); - } - render_messagebox(rgui, msg); - - if (!custom->width) - custom->width = stride_x; - if (!custom->height) - custom->height = stride_y; - - aspectratio_lut[ASPECT_RATIO_CUSTOM].value = - (float)custom->width / custom->height; - - if (driver.video_poke->apply_state_changes) - driver.video_poke->apply_state_changes(driver.video_data); - - return 0; -} - -static int rgui_settings_iterate(rgui_handle_t *rgui, rgui_action_t action) -{ - rgui->frame_buf_pitch = RGUI_WIDTH * 2; - unsigned type = 0; - const char *label = NULL; - if (action != RGUI_ACTION_REFRESH) - rgui_list_get_at_offset(rgui->selection_buf, rgui->selection_ptr, &label, &type); - - if (type == RGUI_SETTINGS_CORE) - { -#if defined(HAVE_DYNAMIC) - label = rgui->libretro_dir; -#elif defined(HAVE_LIBRETRO_MANAGEMENT) - label = default_paths.core_dir; -#else - label = ""; // Shouldn't happen ... -#endif - } - else if (type == RGUI_SETTINGS_CONFIG) - label = g_settings.rgui_config_directory; - else if (type == RGUI_SETTINGS_DISK_APPEND) - label = rgui->base_path; - - const char *dir = NULL; - unsigned menu_type = 0; - rgui_list_get_last(rgui->menu_stack, &dir, &menu_type); - - if (rgui->need_refresh) - action = RGUI_ACTION_NOOP; - - switch (action) - { - case RGUI_ACTION_UP: - if (rgui->selection_ptr > 0) - rgui->selection_ptr--; - else - rgui->selection_ptr = rgui->selection_buf->size - 1; - break; - - case RGUI_ACTION_DOWN: - if (rgui->selection_ptr + 1 < rgui->selection_buf->size) - rgui->selection_ptr++; - else - rgui->selection_ptr = 0; - break; - - case RGUI_ACTION_CANCEL: - if (rgui->menu_stack->size > 1) - { - rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); - rgui->need_refresh = true; - } - break; - - case RGUI_ACTION_LEFT: - case RGUI_ACTION_RIGHT: - case RGUI_ACTION_OK: - case RGUI_ACTION_START: - if ((type == RGUI_SETTINGS_OPEN_FILEBROWSER || type == RGUI_SETTINGS_OPEN_FILEBROWSER_DEFERRED_CORE) - && action == RGUI_ACTION_OK) - { - rgui->defer_core = type == RGUI_SETTINGS_OPEN_FILEBROWSER_DEFERRED_CORE; - rgui_list_push(rgui->menu_stack, rgui->base_path, RGUI_FILE_DIRECTORY, rgui->selection_ptr); - rgui->selection_ptr = 0; - rgui->need_refresh = true; - } - else if ((type == RGUI_SETTINGS_OPEN_HISTORY || menu_type_is(type) == RGUI_FILE_DIRECTORY) && action == RGUI_ACTION_OK) - { - rgui_list_push(rgui->menu_stack, "", type, rgui->selection_ptr); - rgui->selection_ptr = 0; - rgui->need_refresh = true; - } - else if ((menu_type_is(type) == RGUI_SETTINGS || type == RGUI_SETTINGS_CORE || type == RGUI_SETTINGS_CONFIG || type == RGUI_SETTINGS_DISK_APPEND) && action == RGUI_ACTION_OK) - { - rgui_list_push(rgui->menu_stack, label, type, rgui->selection_ptr); - rgui->selection_ptr = 0; - rgui->need_refresh = true; - } - else if (type == RGUI_SETTINGS_CUSTOM_VIEWPORT && action == RGUI_ACTION_OK) - { - rgui_list_push(rgui->menu_stack, "", type, rgui->selection_ptr); - - // Start with something sane. - rarch_viewport_t *custom = &g_extern.console.screen.viewports.custom_vp; - driver.video->viewport_info(driver.video_data, custom); - aspectratio_lut[ASPECT_RATIO_CUSTOM].value = - (float)custom->width / custom->height; - - g_settings.video.aspect_ratio_idx = ASPECT_RATIO_CUSTOM; - if (driver.video_poke->set_aspect_ratio) - driver.video_poke->set_aspect_ratio(driver.video_data, - g_settings.video.aspect_ratio_idx); - } - else - { - int ret = rgui_settings_toggle_setting(rgui, type, action, menu_type); - if (ret) - return ret; - } - break; - - case RGUI_ACTION_REFRESH: - rgui->selection_ptr = 0; - rgui->need_refresh = true; - break; - - case RGUI_ACTION_MESSAGE: - rgui->msg_force = true; - break; - - default: - break; - } - - rgui_list_get_last(rgui->menu_stack, &dir, &menu_type); - - if (rgui->need_refresh && !(menu_type == RGUI_FILE_DIRECTORY || - menu_type_is(menu_type) == RGUI_SETTINGS_SHADER_OPTIONS|| - menu_type_is(menu_type) == RGUI_FILE_DIRECTORY || - menu_type == RGUI_SETTINGS_OVERLAY_PRESET || - menu_type == RGUI_SETTINGS_CORE || - menu_type == RGUI_SETTINGS_CONFIG || - menu_type == RGUI_SETTINGS_DISK_APPEND || - menu_type == RGUI_SETTINGS_OPEN_HISTORY)) - { - rgui->need_refresh = false; - if ( - menu_type == RGUI_SETTINGS_INPUT_OPTIONS - || menu_type == RGUI_SETTINGS_PATH_OPTIONS - || menu_type == RGUI_SETTINGS_OPTIONS - || menu_type == RGUI_SETTINGS_DRIVERS - || menu_type == RGUI_SETTINGS_CORE_OPTIONS - || menu_type == RGUI_SETTINGS_AUDIO_OPTIONS - || menu_type == RGUI_SETTINGS_DISK_OPTIONS - || menu_type == RGUI_SETTINGS_VIDEO_OPTIONS - || menu_type == RGUI_SETTINGS_SHADER_OPTIONS - ) - menu_populate_entries(rgui, menu_type); - else - menu_populate_entries(rgui, RGUI_SETTINGS); - } - - render_text(rgui); - - // Have to defer it so we let settings refresh. - if (rgui->push_start_screen) - { - rgui->push_start_screen = false; - rgui_list_push(rgui->menu_stack, "", RGUI_START_SCREEN, 0); - } - - return 0; -} - -static inline void rgui_descend_alphabet(rgui_handle_t *rgui, size_t *ptr_out) -{ - if (!rgui->scroll_indices_size) - return; - size_t ptr = *ptr_out; - if (ptr == 0) - return; - size_t i = rgui->scroll_indices_size - 1; - while (i && rgui->scroll_indices[i - 1] >= ptr) - i--; - *ptr_out = rgui->scroll_indices[i - 1]; -} - -static inline void rgui_ascend_alphabet(rgui_handle_t *rgui, size_t *ptr_out) -{ - if (!rgui->scroll_indices_size) - return; - size_t ptr = *ptr_out; - if (ptr == rgui->scroll_indices[rgui->scroll_indices_size - 1]) - return; - size_t i = 0; - while (i < rgui->scroll_indices_size - 1 && rgui->scroll_indices[i + 1] <= ptr) - i++; - *ptr_out = rgui->scroll_indices[i + 1]; -} - - -static int rgui_iterate(void *data, unsigned action) -{ - rgui_handle_t *rgui = (rgui_handle_t*)data; - - const char *dir = 0; - unsigned menu_type = 0; - rgui_list_get_last(rgui->menu_stack, &dir, &menu_type); - int ret = 0; - - if (driver.video_poke && driver.video_poke->set_texture_enable) - driver.video_poke->set_texture_frame(driver.video_data, menu_framebuf, - false, RGUI_WIDTH, RGUI_HEIGHT, 1.0f); - - if (menu_type == RGUI_START_SCREEN) - return rgui_start_screen_iterate(rgui, action); - else if (menu_type_is(menu_type) == RGUI_SETTINGS) - return rgui_settings_iterate(rgui, action); - else if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT || menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2) - return rgui_viewport_iterate(rgui, action); - else if (menu_type == RGUI_SETTINGS_CUSTOM_BIND) - return rgui_custom_bind_iterate(rgui, action); - - if (rgui->need_refresh && action != RGUI_ACTION_MESSAGE) - action = RGUI_ACTION_NOOP; - - unsigned scroll_speed = (max(rgui->scroll_accel, 2) - 2) / 4 + 1; - unsigned fast_scroll_speed = 4 + 4 * scroll_speed; - - switch (action) - { - case RGUI_ACTION_UP: - if (rgui->selection_ptr >= scroll_speed) - rgui->selection_ptr -= scroll_speed; - else - rgui->selection_ptr = rgui->selection_buf->size - 1; - break; - - case RGUI_ACTION_DOWN: - if (rgui->selection_ptr + scroll_speed < rgui->selection_buf->size) - rgui->selection_ptr += scroll_speed; - else - rgui->selection_ptr = 0; - break; - - case RGUI_ACTION_LEFT: - if (rgui->selection_ptr > fast_scroll_speed) - rgui->selection_ptr -= fast_scroll_speed; - else - rgui->selection_ptr = 0; - break; - - case RGUI_ACTION_RIGHT: - if (rgui->selection_ptr + fast_scroll_speed < rgui->selection_buf->size) - rgui->selection_ptr += fast_scroll_speed; - else - rgui->selection_ptr = rgui->selection_buf->size - 1; - break; - - case RGUI_ACTION_SCROLL_UP: - rgui_descend_alphabet(rgui, &rgui->selection_ptr); - break; - case RGUI_ACTION_SCROLL_DOWN: - rgui_ascend_alphabet(rgui, &rgui->selection_ptr); - break; - - case RGUI_ACTION_CANCEL: - if (rgui->menu_stack->size > 1) - { - rgui->need_refresh = true; - rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr); - } - break; - - case RGUI_ACTION_OK: - { - if (rgui->selection_buf->size == 0) - return 0; - - const char *path = 0; - unsigned type = 0; - rgui_list_get_at_offset(rgui->selection_buf, rgui->selection_ptr, &path, &type); - - if ( - menu_type_is(type) == RGUI_SETTINGS_SHADER_OPTIONS || - menu_type_is(type) == RGUI_FILE_DIRECTORY || - type == RGUI_SETTINGS_OVERLAY_PRESET || - type == RGUI_SETTINGS_CORE || - type == RGUI_SETTINGS_CONFIG || - type == RGUI_SETTINGS_DISK_APPEND || - type == RGUI_FILE_DIRECTORY) - { - char cat_path[PATH_MAX]; - fill_pathname_join(cat_path, dir, path, sizeof(cat_path)); - - rgui_list_push(rgui->menu_stack, cat_path, type, rgui->selection_ptr); - rgui->selection_ptr = 0; - rgui->need_refresh = true; - } - else - { -#ifdef HAVE_SHADER_MANAGER - if (menu_type_is(menu_type) == RGUI_SETTINGS_SHADER_OPTIONS) - { - if (menu_type == RGUI_SETTINGS_SHADER_PRESET) - { - char shader_path[PATH_MAX]; - fill_pathname_join(shader_path, dir, path, sizeof(shader_path)); - shader_manager_set_preset(&rgui->shader, gfx_shader_parse_type(shader_path, RARCH_SHADER_NONE), - shader_path); - } - else - { - unsigned pass = (menu_type - RGUI_SETTINGS_SHADER_0) / 3; - fill_pathname_join(rgui->shader.pass[pass].source.cg, - dir, path, sizeof(rgui->shader.pass[pass].source.cg)); - } - - // Pop stack until we hit shader manager again. - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_SHADER_OPTIONS); - } - else -#endif - if (menu_type == RGUI_SETTINGS_DEFERRED_CORE) - { - // FIXME: Add for consoles. - strlcpy(g_settings.libretro, path, sizeof(g_settings.libretro)); - strlcpy(g_extern.fullpath, rgui->deferred_path, sizeof(g_extern.fullpath)); -#ifdef HAVE_DYNAMIC - libretro_free_system_info(&rgui->info); - libretro_get_system_info(g_settings.libretro, &rgui->info, - &rgui->load_no_rom); - - g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME); -#else - rarch_environment_cb(RETRO_ENVIRONMENT_SET_LIBRETRO_PATH, (void*)g_settings.libretro); - rarch_environment_cb(RETRO_ENVIRONMENT_EXEC, (void*)g_extern.fullpath); -#endif - rgui->msg_force = true; - ret = -1; - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); - } - else if (menu_type == RGUI_SETTINGS_CORE) - { -#if defined(HAVE_DYNAMIC) - fill_pathname_join(g_settings.libretro, dir, path, sizeof(g_settings.libretro)); - libretro_free_system_info(&rgui->info); - libretro_get_system_info(g_settings.libretro, &rgui->info, - &rgui->load_no_rom); - - // No ROM needed for this core, load game immediately. - if (rgui->load_no_rom) - { - g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME); - *g_extern.fullpath = '\0'; - rgui->msg_force = true; - ret = -1; - } - - // Core selection on non-console just updates directory listing. - // Will take affect on new ROM load. -#elif defined(GEKKO) && defined(HW_RVL) - rarch_environment_cb(RETRO_ENVIRONMENT_SET_LIBRETRO_PATH, (void*)path); - - fill_pathname_join(g_extern.fullpath, default_paths.core_dir, - SALAMANDER_FILE, sizeof(g_extern.fullpath)); - g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME); - g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN); - ret = -1; -#endif - - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); - } - else if (menu_type == RGUI_SETTINGS_CONFIG) - { - char config[PATH_MAX]; - fill_pathname_join(config, dir, path, sizeof(config)); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); - rgui->msg_force = true; - if (menu_replace_config(config)) - { - rgui->selection_ptr = 0; // Menu can shrink. - ret = -1; - } - } -#ifdef HAVE_OVERLAY - else if (menu_type == RGUI_SETTINGS_OVERLAY_PRESET) - { - fill_pathname_join(g_settings.input.overlay, dir, path, sizeof(g_settings.input.overlay)); - - if (driver.overlay) - input_overlay_free(driver.overlay); - driver.overlay = input_overlay_new(g_settings.input.overlay); - if (!driver.overlay) - RARCH_ERR("Failed to load overlay.\n"); - - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_INPUT_OPTIONS); - } -#endif - else if (menu_type == RGUI_SETTINGS_DISK_APPEND) - { - char image[PATH_MAX]; - fill_pathname_join(image, dir, path, sizeof(image)); - rarch_disk_control_append_image(image); - - g_extern.lifecycle_mode_state |= 1ULL << MODE_GAME; - - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); - ret = -1; - } - else if (menu_type == RGUI_SETTINGS_OPEN_HISTORY) - { - load_menu_game_history(rgui->selection_ptr); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); - ret = -1; - } - else if (menu_type == RGUI_BROWSER_DIR_PATH) - { - strlcpy(g_settings.rgui_browser_directory, dir, sizeof(g_settings.rgui_browser_directory)); - strlcpy(rgui->base_path, dir, sizeof(rgui->base_path)); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); - } -#ifdef HAVE_SCREENSHOTS - else if (menu_type == RGUI_SCREENSHOT_DIR_PATH) - { - strlcpy(g_settings.screenshot_directory, dir, sizeof(g_settings.screenshot_directory)); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); - } -#endif - else if (menu_type == RGUI_SAVEFILE_DIR_PATH) - { - strlcpy(g_extern.savefile_dir, dir, sizeof(g_extern.savefile_dir)); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); - } -#ifdef HAVE_OVERLAY - else if (menu_type == RGUI_OVERLAY_DIR_PATH) - { - strlcpy(g_extern.overlay_dir, dir, sizeof(g_extern.overlay_dir)); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); - } -#endif - else if (menu_type == RGUI_SAVESTATE_DIR_PATH) - { - strlcpy(g_extern.savestate_dir, dir, sizeof(g_extern.savestate_dir)); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); - } -#ifdef HAVE_DYNAMIC - else if (menu_type == RGUI_LIBRETRO_DIR_PATH) - { - strlcpy(rgui->libretro_dir, dir, sizeof(rgui->libretro_dir)); - menu_init_core_info(rgui); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); - } - else if (menu_type == RGUI_CONFIG_DIR_PATH) - { - strlcpy(g_settings.rgui_config_directory, dir, sizeof(g_settings.rgui_config_directory)); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); - } -#endif - else if (menu_type == RGUI_LIBRETRO_INFO_DIR_PATH) - { - strlcpy(g_settings.libretro_info_path, dir, sizeof(g_settings.libretro_info_path)); - menu_init_core_info(rgui); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); - } - else if (menu_type == RGUI_SHADER_DIR_PATH) - { - strlcpy(g_settings.video.shader_dir, dir, sizeof(g_settings.video.shader_dir)); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); - } - else if (menu_type == RGUI_SYSTEM_DIR_PATH) - { - strlcpy(g_settings.system_directory, dir, sizeof(g_settings.system_directory)); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); - } - else - { - if (rgui->defer_core) - { - fill_pathname_join(rgui->deferred_path, dir, path, sizeof(rgui->deferred_path)); - - const core_info_t *info = NULL; - size_t supported = 0; - if (rgui->core_info) - core_info_list_get_supported_cores(rgui->core_info, rgui->deferred_path, &info, &supported); - - if (supported == 1) // Can make a decision right now. - { - strlcpy(g_extern.fullpath, rgui->deferred_path, sizeof(g_extern.fullpath)); - strlcpy(g_settings.libretro, info->path, sizeof(g_settings.libretro)); - -#ifdef HAVE_DYNAMIC - libretro_free_system_info(&rgui->info); - libretro_get_system_info(g_settings.libretro, &rgui->info, - &rgui->load_no_rom); -#else - rarch_environment_cb(RETRO_ENVIRONMENT_SET_LIBRETRO_PATH, (void*)g_settings.libretro); - rarch_environment_cb(RETRO_ENVIRONMENT_EXEC, (void*)g_extern.fullpath); -#endif - - g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME); - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); - rgui->msg_force = true; - ret = -1; - } - else // Present a selection. - { - rgui_list_push(rgui->menu_stack, rgui->libretro_dir, RGUI_SETTINGS_DEFERRED_CORE, rgui->selection_ptr); - rgui->selection_ptr = 0; - rgui->need_refresh = true; - } - } - else - { - fill_pathname_join(g_extern.fullpath, dir, path, sizeof(g_extern.fullpath)); - g_extern.lifecycle_mode_state |= (1ULL << MODE_LOAD_GAME); - - rgui_flush_menu_stack_type(rgui, RGUI_SETTINGS); - rgui->msg_force = true; - ret = -1; - } - } - } - break; - } - - case RGUI_ACTION_REFRESH: - rgui->selection_ptr = 0; - rgui->need_refresh = true; - break; - - case RGUI_ACTION_MESSAGE: - rgui->msg_force = true; - break; - - default: - break; - } - - // refresh values in case the stack changed - rgui_list_get_last(rgui->menu_stack, &dir, &menu_type); - - if (rgui->need_refresh && (menu_type == RGUI_FILE_DIRECTORY || - menu_type_is(menu_type) == RGUI_SETTINGS_SHADER_OPTIONS || - menu_type_is(menu_type) == RGUI_FILE_DIRECTORY || - menu_type == RGUI_SETTINGS_OVERLAY_PRESET || - menu_type == RGUI_SETTINGS_DEFERRED_CORE || - menu_type == RGUI_SETTINGS_CORE || - menu_type == RGUI_SETTINGS_CONFIG || - menu_type == RGUI_SETTINGS_OPEN_HISTORY || - menu_type == RGUI_SETTINGS_DISK_APPEND)) - { - rgui->need_refresh = false; - menu_parse_and_resolve(rgui, menu_type); - } - - render_text(rgui); - - return ret; -} - int rgui_input_postprocess(void *data, uint64_t old_state) { (void)data; @@ -1395,8 +579,19 @@ int rgui_input_postprocess(void *data, uint64_t old_state) return ret; } +void rgui_set_texture(void *data, bool enable) +{ + rgui_handle_t *rgui = (rgui_handle_t*)data; + + if (driver.video_poke && driver.video_poke->set_texture_enable) + driver.video_poke->set_texture_frame(driver.video_data, menu_framebuf, + enable, rgui->width, rgui->height, 1.0f); +} + const menu_ctx_driver_t menu_ctx_rgui = { - rgui_iterate, + rgui_set_texture, + rgui_render_messagebox, + rgui_render, rgui_init, rgui_free, "rgui", diff --git a/frontend/menu/rmenu.c b/frontend/menu/rmenu.c index 0810fe7b6e..7e03a100f0 100644 --- a/frontend/menu/rmenu.c +++ b/frontend/menu/rmenu.c @@ -85,6 +85,9 @@ size_t drive_mapping_idx = 1; unsigned settings_lut[SETTING_LAST_LAST] = {0}; +// forward decls +void rmenu_set_texture(void *data, bool enable); + static const char *menu_drive_mapping_previous(void) { if (drive_mapping_idx > 0) @@ -232,7 +235,759 @@ uint8_t items_pages[SETTING_LAST_LAST] = {0}; static unsigned hist_opt_selected = 0; static unsigned core_opt_selected = 0; -#include "rmenudisp.c" +#if defined(_XBOX1) +#define HARDCODE_FONT_SIZE 21 +#define FONT_SIZE_VARIABLE FONT_SIZE + +#define POSITION_X 60 +#define POSITION_X_CENTER (POSITION_X + 350) +#define POSITION_Y_START 80 +#define Y_POSITION 430 +#define POSITION_Y_BEGIN (POSITION_Y_START + POSITION_Y_INCREMENT) +#define POSITION_Y_INCREMENT 20 +#define COMMENT_POSITION_Y (Y_POSITION - ((POSITION_Y_INCREMENT/2) * 3)) +#define CORE_MSG_POSITION_X FONT_SIZE +#define CORE_MSG_POSITION_Y (MSG_PREV_NEXT_Y_POSITION + 0.01f) +#define CORE_MSG_FONT_SIZE FONT_SIZE +#define MSG_QUEUE_X_POSITION POSITION_X +#define MSG_QUEUE_Y_POSITION (Y_POSITION - ((POSITION_Y_INCREMENT/2) * 7) + 10) +#define MSG_QUEUE_FONT_SIZE HARDCODE_FONT_SIZE +#define MSG_PREV_NEXT_Y_POSITION 24 +#define CURRENT_PATH_Y_POSITION (POSITION_Y_START - ((POSITION_Y_INCREMENT/2))) +#define CURRENT_PATH_FONT_SIZE 21 + +#define FONT_SIZE 21 + +#define NUM_ENTRY_PER_PAGE 15 +#elif defined(__CELLOS_LV2__) +#define HARDCODE_FONT_SIZE 0.91f +#define FONT_SIZE_VARIABLE g_settings.video.font_size +#define POSITION_X 0.09f +#define POSITION_X_CENTER 0.5f +#define POSITION_Y_START 0.17f +#define POSITION_Y_INCREMENT 0.035f +#define POSITION_Y_BEGIN (POSITION_Y_START + POSITION_Y_INCREMENT) +#define COMMENT_POSITION_Y 0.82f +#define CORE_MSG_POSITION_X 0.3f +#define CORE_MSG_POSITION_Y 0.06f +#define CORE_MSG_FONT_SIZE COMMENT_POSITION_Y + +#define MSG_QUEUE_X_POSITION g_settings.video.msg_pos_x +#define MSG_QUEUE_Y_POSITION 0.90f +#define MSG_QUEUE_FONT_SIZE 1.03f + +#define MSG_PREV_NEXT_Y_POSITION 0.03f +#define CURRENT_PATH_Y_POSITION 0.15f +#define CURRENT_PATH_FONT_SIZE (g_settings.video.font_size) + +#define NUM_ENTRY_PER_PAGE 18 +#endif + +static void rmenu_render(void *data) +{ + rgui_handle_t *rgui = (rgui_handle_t*)data; + font_params_t font_parms = {0}; + + char msg[128]; + char label[64]; + + font_parms.x = POSITION_X; + font_parms.y = CURRENT_PATH_Y_POSITION; + font_parms.scale = CURRENT_PATH_FONT_SIZE; + font_parms.color = WHITE; + + switch(rgui->menu_type) + { +#ifdef HAVE_SHADER_MANAGER + case SHADER_CHOICE: + case CGP_CHOICE: +#endif + case BORDER_CHOICE: + case LIBRETRO_CHOICE: + case PATH_SAVESTATES_DIR_CHOICE: + case PATH_DEFAULT_ROM_DIR_CHOICE: +#ifdef HAVE_XML + case PATH_CHEATS_DIR_CHOICE: +#endif + case PATH_SRAM_DIR_CHOICE: + case PATH_SYSTEM_DIR_CHOICE: + case CONFIG_CHOICE: + case FILE_BROWSER_MENU: + if (rgui->menu_type == LIBRETRO_CHOICE) + strlcpy(label, "CORE SELECTION", sizeof(label)); + else if (rgui->menu_type == CONFIG_CHOICE) + strlcpy(label, "CONFIG", sizeof(label)); + else + strlcpy(label, "PATH", sizeof(label)); + snprintf(msg, sizeof(msg), "%s %s", label, rgui->browser->current_dir.directory_path); + break; + case INGAME_MENU_LOAD_GAME_HISTORY: + strlcpy(msg, "LOAD HISTORY", sizeof(msg)); + break; + case INGAME_MENU: + strlcpy(msg, "MENU", sizeof(msg)); + break; + case INGAME_MENU_CORE_OPTIONS: + strlcpy(msg, "CORE OPTIONS", sizeof(msg)); + break; + case INGAME_MENU_VIDEO_OPTIONS: + case INGAME_MENU_VIDEO_OPTIONS_MODE: + strlcpy(msg, "VIDEO OPTIONS", sizeof(msg)); + break; +#ifdef HAVE_SHADER_MANAGER + case INGAME_MENU_SHADER_OPTIONS: + case INGAME_MENU_SHADER_OPTIONS_MODE: + strlcpy(msg, "SHADER OPTIONS", sizeof(msg)); + break; +#endif + case INGAME_MENU_INPUT_OPTIONS: + case INGAME_MENU_INPUT_OPTIONS_MODE: + strlcpy(msg, "INPUT OPTIONS", sizeof(msg)); + break; + case INGAME_MENU_CUSTOM_RATIO: + strlcpy(msg, "CUSTOM RATIO", sizeof(msg)); + break; + case INGAME_MENU_SETTINGS: + case INGAME_MENU_SETTINGS_MODE: + strlcpy(msg, "MENU SETTINGS", sizeof(msg)); + break; + case INGAME_MENU_AUDIO_OPTIONS: + case INGAME_MENU_AUDIO_OPTIONS_MODE: + strlcpy(msg, "AUDIO OPTIONS", sizeof(msg)); + break; + case INGAME_MENU_PATH_OPTIONS: + case INGAME_MENU_PATH_OPTIONS_MODE: + strlcpy(msg, "PATH OPTIONS", sizeof(msg)); + break; + } + + if (driver.video_poke->set_osd_msg && msg[0] != '\0') + driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms); + + font_parms.x = POSITION_X; + font_parms.y = CORE_MSG_POSITION_Y; + font_parms.scale = CORE_MSG_FONT_SIZE; + font_parms.color = WHITE; + + snprintf(msg, sizeof(msg), "%s - %s %s", PACKAGE_VERSION, rgui->info.library_name, rgui->info.library_version); + + if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms); + + bool render_browser = false; + bool render_settings = false; + bool render_history = false; + bool render_ingame_menu_resize = false; + bool render_core_options = false; + + switch(rgui->menu_type) + { + case FILE_BROWSER_MENU: + case LIBRETRO_CHOICE: + case CONFIG_CHOICE: +#ifdef HAVE_SHADER_MANAGER + case CGP_CHOICE: + case SHADER_CHOICE: +#endif + case BORDER_CHOICE: + case PATH_DEFAULT_ROM_DIR_CHOICE: + case PATH_SAVESTATES_DIR_CHOICE: + case PATH_SRAM_DIR_CHOICE: +#ifdef HAVE_XML + case PATH_CHEATS_DIR_CHOICE: +#endif + case PATH_SYSTEM_DIR_CHOICE: + render_browser = true; + break; + case INGAME_MENU_CUSTOM_RATIO: + render_ingame_menu_resize = true; + break; + case INGAME_MENU: + case INGAME_MENU_SETTINGS: + case INGAME_MENU_VIDEO_OPTIONS: + case INGAME_MENU_SHADER_OPTIONS: + case INGAME_MENU_AUDIO_OPTIONS: + case INGAME_MENU_INPUT_OPTIONS: + case INGAME_MENU_PATH_OPTIONS: + render_settings = true; + break; + case INGAME_MENU_LOAD_GAME_HISTORY: + render_history = true; + break; + case INGAME_MENU_CORE_OPTIONS: + render_core_options = true; + break; + } + + if (render_browser) + { + font_params_t font_parms = {0}; + font_parms.scale = FONT_SIZE_VARIABLE; + + if (rgui->browser->list->size) + { + unsigned file_count = rgui->browser->list->size; + unsigned current_index = 0; + unsigned page_number = 0; + unsigned page_base = 0; + unsigned i; + float y_increment = POSITION_Y_START; + + current_index = rgui->browser->current_dir.ptr; + page_number = current_index / NUM_ENTRY_PER_PAGE; + page_base = page_number * NUM_ENTRY_PER_PAGE; + + + for (i = page_base; i < file_count && i < page_base + NUM_ENTRY_PER_PAGE; ++i) + { + char fname[128]; + fill_pathname_base(fname, rgui->browser->list->elems[i].data, sizeof(fname)); + y_increment += POSITION_Y_INCREMENT; + +#ifdef HAVE_MENU_PANEL + //check if this is the currently selected file + if (strcmp(rgui->browser->current_dir.path, rgui->browser->list->elems[i].data) == 0) + menu_panel->y = y_increment; +#endif + + font_parms.x = POSITION_X; + font_parms.y = y_increment; + font_parms.color = i == current_index ? YELLOW : rgui->browser->list->elems[i].attr.b ? GREEN : WHITE; + + if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, fname, &font_parms); + } + } + else + { + char entry[128]; + font_parms.x = POSITION_X; + font_parms.y = POSITION_Y_START + POSITION_Y_INCREMENT; + font_parms.color = WHITE; + strlcpy(entry, "No entries available.", sizeof(entry)); + + if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, entry, &font_parms); + } + } + + if (render_core_options) + { + float y_increment = POSITION_Y_START; + + y_increment += POSITION_Y_INCREMENT; + + font_parms.x = POSITION_X; + font_parms.y = y_increment; + font_parms.scale = CURRENT_PATH_FONT_SIZE; + font_parms.color = WHITE; + + if (g_extern.system.core_options) + { + size_t opts = core_option_size(g_extern.system.core_options); + for (size_t i = 0; i < opts; i++, font_parms.y += POSITION_Y_INCREMENT) + { + char type_str[256]; + + /* not on same page? */ + if ((i / NUM_ENTRY_PER_PAGE) != (core_opt_selected / NUM_ENTRY_PER_PAGE)) + continue; + +#ifdef HAVE_MENU_PANEL + //check if this is the currently selected option + if (i == core_opt_selected) + menu_panel->y = font_parms.y; +#endif + + font_parms.x = POSITION_X; + font_parms.color = (core_opt_selected == i) ? YELLOW : WHITE; + + if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, + core_option_get_desc(g_extern.system.core_options, i), &font_parms); + + font_parms.x = POSITION_X_CENTER; + font_parms.color = WHITE; + + strlcpy(type_str, core_option_get_val(g_extern.system.core_options, i), sizeof(type_str)); + + if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, type_str, &font_parms); + } + } + else if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, "No options available.", &font_parms); + } + + if (render_settings) + { + float y_increment = POSITION_Y_START; + uint8_t i = 0; + uint8_t j = 0; + uint8_t item_page = 0; + + for(i = first_setting; i < max_settings; i++) + { + char text[PATH_MAX]; + char setting_text[PATH_MAX]; + unsigned w; + + strlcpy(setting_text, "", sizeof(setting_text)); + + switch (i) + { +#ifdef __CELLOS_LV2__ + case SETTING_CHANGE_RESOLUTION: + strlcpy(text, "Resolution", sizeof(text)); + break; + case SETTING_PAL60_MODE: + strlcpy(text, "PAL60 Mode", sizeof(text)); + if (g_extern.lifecycle_mode_state & (1ULL << MODE_VIDEO_PAL_TEMPORAL_ENABLE)) + strlcpy(setting_text, "ON", sizeof(setting_text)); + else + strlcpy(setting_text, "OFF", sizeof(setting_text)); + break; +#endif + case SETTING_EMU_SKIN: + strlcpy(text, "Menu Skin", sizeof(text)); + fill_pathname_base(setting_text, g_extern.menu_texture_path, sizeof(setting_text)); + break; + case SETTING_HW_TEXTURE_FILTER: + strlcpy(text, "Default Filter", sizeof(text)); + break; +#ifdef _XBOX1 + case SETTING_FLICKER_FILTER: + strlcpy(text, "Flicker Filter", sizeof(text)); + snprintf(setting_text, sizeof(setting_text), "%d", g_extern.console.screen.flicker_filter_index); + break; + case SETTING_SOFT_DISPLAY_FILTER: + strlcpy(text, "Soft Display Filter", sizeof(text)); + snprintf(setting_text, sizeof(setting_text), (g_extern.lifecycle_mode_state & (1ULL << MODE_VIDEO_SOFT_FILTER_ENABLE)) ? "ON" : "OFF"); + break; +#endif + case SETTING_REFRESH_RATE: + strlcpy(text, "Estimated Monitor FPS", sizeof(text)); + break; + case SETTING_VIDEO_VSYNC: + strlcpy(text, "VSync", sizeof(text)); + break; + case SETTING_VIDEO_CROP_OVERSCAN: + strlcpy(text, "Crop Overscan (reload)", sizeof(text)); + break; + case SETTING_TRIPLE_BUFFERING: + strlcpy(text, "Triple Buffering", sizeof(text)); + snprintf(setting_text, sizeof(setting_text), (g_extern.lifecycle_mode_state & (1ULL << MODE_VIDEO_TRIPLE_BUFFERING_ENABLE)) ? "ON" : "OFF"); + break; + case SETTING_SOUND_MODE: + strlcpy(text, "Sound Output", sizeof(text)); + switch(g_extern.console.sound.mode) + { + case SOUND_MODE_NORMAL: + strlcpy(setting_text, "Normal", sizeof(setting_text)); + break; +#ifdef HAVE_RSOUND + case SOUND_MODE_RSOUND: + strlcpy(setting_text, "RSound", sizeof(setting_text)); + break; +#endif +#ifdef HAVE_HEADSET + case SOUND_MODE_HEADSET: + strlcpy(setting_text, "USB/Bluetooth Headset", sizeof(setting_text)); + break; +#endif + default: + break; + } + break; +#ifdef HAVE_RSOUND + case SETTING_RSOUND_SERVER_IP_ADDRESS: + strlcpy(text, "RSound Server IP Address", sizeof(text)); + strlcpy(setting_text, g_settings.audio.device, sizeof(setting_text)); + break; +#endif + case SETTING_EMU_SHOW_DEBUG_INFO_MSG: + strlcpy(text, "Show Framerate", sizeof(text)); + break; + case SETTING_REWIND_ENABLED: + strlcpy(text, "Rewind", sizeof(text)); + break; + case SETTING_REWIND_GRANULARITY: + strlcpy(text, "Rewind Granularity", sizeof(text)); + break; + case SETTING_EMU_AUDIO_MUTE: + strlcpy(text, "Mute Audio", sizeof(text)); + break; + case SETTING_AUDIO_CONTROL_RATE_DELTA: + strlcpy(text, "Rate Control Delta", sizeof(text)); + break; +#ifdef _XBOX1 + case SETTING_EMU_AUDIO_SOUND_VOLUME_LEVEL: + strlcpy(text, "Volume Level", sizeof(text)); + snprintf(setting_text, sizeof(setting_text), g_extern.console.sound.volume_level ? "Loud" : "Normal"); + break; +#endif + case SETTING_ENABLE_CUSTOM_BGM: + strlcpy(text, "Custom BGM Option", sizeof(text)); + snprintf(setting_text, sizeof(setting_text), (g_extern.lifecycle_mode_state & (1ULL << MODE_AUDIO_CUSTOM_BGM_ENABLE)) ? "ON" : "OFF"); + break; + case SETTING_PATH_DEFAULT_ROM_DIRECTORY: + strlcpy(text, "Browser Directory", sizeof(text)); + break; + case SETTING_PATH_SAVESTATES_DIRECTORY: + strlcpy(text, "Savestate Directory", sizeof(text)); + break; + case SETTING_PATH_SRAM_DIRECTORY: + strlcpy(text, "Savefile Directory", sizeof(text)); + break; +#ifdef HAVE_XML + case SETTING_PATH_CHEATS: + strlcpy(text, "Cheatfile Directory", sizeof(text)); + strlcpy(setting_text, g_settings.cheat_database, sizeof(setting_text)); + break; +#endif + case SETTING_PATH_SYSTEM: + strlcpy(text, "System Directory", sizeof(text)); + break; + case SETTING_CONTROLS_NUMBER: + strlcpy(text, "Player", sizeof(text)); + break; + case SETTING_CONTROLS_BIND_DEVICE_TYPE: + strlcpy(text, "Device Type", sizeof(text)); + break; + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_B: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_Y: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_SELECT: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_START: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_UP: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_DOWN: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_LEFT: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_RIGHT: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_A: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_X: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_L: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_L2: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R2: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_L3: + case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R3: + { + unsigned id = i - FIRST_CONTROL_BIND; + struct platform_bind key_label; + strlcpy(key_label.desc, "Unknown", sizeof(key_label.desc)); + key_label.joykey = g_settings.input.binds[rgui->current_pad][id].joykey; + + if (driver.input->set_keybinds) + driver.input->set_keybinds(&key_label, 0, 0, 0, (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)); + strlcpy(text, g_settings.input.binds[rgui->current_pad][id].desc, sizeof(text)); + strlcpy(setting_text, key_label.desc, sizeof(setting_text)); + } + break; + case SETTING_CONTROLS_DEFAULT_ALL: + strlcpy(text, "DEFAULTS", sizeof(text)); + break; + case INGAME_MENU_LOAD_STATE: + strlcpy(text, "Load State", sizeof(text)); + snprintf(setting_text, sizeof(setting_text), "%d", g_extern.state_slot); + break; + case INGAME_MENU_SAVE_STATE: + strlcpy(text, "Save State", sizeof(text)); + snprintf(setting_text, sizeof(setting_text), "%d", g_extern.state_slot); + break; + case SETTING_ASPECT_RATIO: + strlcpy(text, "Aspect Ratio", sizeof(text)); + break; + case SETTING_ROTATION: + strlcpy(text, "Rotation", sizeof(text)); + break; + case SETTING_CUSTOM_VIEWPORT: + strlcpy(text, "Custom Ratio", sizeof(text)); + break; + case INGAME_MENU_CORE_OPTIONS_MODE: + strlcpy(text, "Core Options", sizeof(text)); + break; +#ifdef HAVE_SHADER_MANAGER + case INGAME_MENU_SHADER_OPTIONS_MODE: + strlcpy(text, "Shader Options", sizeof(text)); + break; +#endif + case INGAME_MENU_LOAD_GAME_HISTORY_MODE: + strlcpy(text, "Load Game (History)", sizeof(text)); + break; + case INGAME_MENU_VIDEO_OPTIONS_MODE: + strlcpy(text, "Video Options", sizeof(text)); + break; + case INGAME_MENU_AUDIO_OPTIONS_MODE: + strlcpy(text, "Audio Options", sizeof(text)); + break; + case INGAME_MENU_INPUT_OPTIONS_MODE: + strlcpy(text, "Input Options", sizeof(text)); + break; + case INGAME_MENU_PATH_OPTIONS_MODE: + strlcpy(text, "Path Options", sizeof(text)); + break; + case INGAME_MENU_SETTINGS_MODE: + strlcpy(text, "Settings", sizeof(text)); + break; + case INGAME_MENU_SCREENSHOT_MODE: + strlcpy(text, "Take Screenshot", sizeof(text)); + break; + case INGAME_MENU_RESET: + strlcpy(text, "Restart Game", sizeof(text)); + break; + case INGAME_MENU_RETURN_TO_GAME: + strlcpy(text, "Resume Game", sizeof(text)); + break; + case INGAME_MENU_CHANGE_GAME: + snprintf(text, sizeof(text), "Load Game (%s)", + rgui->info.library_name ? rgui->info.library_name : g_extern.system.info.library_name); + break; + case INGAME_MENU_CHANGE_LIBRETRO_CORE: + strlcpy(text, "Core", sizeof(text)); + break; +#ifdef HAVE_MULTIMAN + case INGAME_MENU_RETURN_TO_MULTIMAN: + strlcpy(text, "Return to multiMAN", sizeof(text)); + break; +#endif + case INGAME_MENU_CONFIG: + strlcpy(text, "RetroArch Config", sizeof(text)); + break; + case INGAME_MENU_SAVE_CONFIG: + strlcpy(text, "Save Config", sizeof(text)); + break; + case INGAME_MENU_QUIT_RETROARCH: + strlcpy(text, "Quit RetroArch", sizeof(text)); + break; + default: + break; +#ifdef HAVE_SHADER_MANAGER + case SHADERMAN_LOAD_CGP: + strlcpy(text, "Load Shader Preset", sizeof(text)); + break; + case SHADERMAN_SAVE_CGP: + strlcpy(text, "Save Shader Preset", sizeof(text)); + break; + case SHADERMAN_SHADER_PASSES: + strlcpy(text, "Shader Passes", sizeof(text)); + snprintf(setting_text, sizeof(setting_text), "%u", rgui->shader.passes); + break; + case SHADERMAN_APPLY_CHANGES: + strlcpy(text, "Apply Shader Changes", sizeof(text)); + break; + case SHADERMAN_SHADER_0: + case SHADERMAN_SHADER_1: + case SHADERMAN_SHADER_2: + case SHADERMAN_SHADER_3: + case SHADERMAN_SHADER_4: + case SHADERMAN_SHADER_5: + case SHADERMAN_SHADER_6: + case SHADERMAN_SHADER_7: + { + char type_str[256]; + uint8_t index = (i - SHADERMAN_SHADER_0) / 3; + if (*rgui->shader.pass[index].source.cg) + fill_pathname_base(type_str, + rgui->shader.pass[index].source.cg, sizeof(type_str)); + else + strlcpy(type_str, "N/A", sizeof(type_str)); + snprintf(text, sizeof(text), "Shader #%d", index); + strlcpy(setting_text, type_str, sizeof(setting_text)); + } + break; + case SHADERMAN_SHADER_0_FILTER: + case SHADERMAN_SHADER_1_FILTER: + case SHADERMAN_SHADER_2_FILTER: + case SHADERMAN_SHADER_3_FILTER: + case SHADERMAN_SHADER_4_FILTER: + case SHADERMAN_SHADER_5_FILTER: + case SHADERMAN_SHADER_6_FILTER: + case SHADERMAN_SHADER_7_FILTER: + { + char type_str[256]; + uint8_t index = (i - SHADERMAN_SHADER_0) / 3; + snprintf(text, sizeof(text), "Shader #%d filter", index); + shader_manager_get_str_filter(type_str, sizeof(type_str), index); + strlcpy(setting_text, type_str, sizeof(setting_text)); + } + break; + case SHADERMAN_SHADER_0_SCALE: + case SHADERMAN_SHADER_1_SCALE: + case SHADERMAN_SHADER_2_SCALE: + case SHADERMAN_SHADER_3_SCALE: + case SHADERMAN_SHADER_4_SCALE: + case SHADERMAN_SHADER_5_SCALE: + case SHADERMAN_SHADER_6_SCALE: + case SHADERMAN_SHADER_7_SCALE: + { + char type_str[256]; + uint8_t index = (i - SHADERMAN_SHADER_0) / 3; + unsigned scale = rgui->shader.pass[index].fbo.scale_x; + + snprintf(text, sizeof(text), "Shader #%d scale", index); + + if (!scale) + strlcpy(type_str, "Don't care", sizeof(type_str)); + else + snprintf(type_str, sizeof(type_str), "%ux", scale); + + strlcpy(setting_text, type_str, sizeof(setting_text)); + } + break; +#endif + } + + switch (i) + { +#ifdef __CELLOS_LV2__ + case SETTING_CHANGE_RESOLUTION: +#endif + case INGAME_MENU_CONFIG: + case SETTING_ROTATION: + case SETTING_ASPECT_RATIO: + case SETTING_CONTROLS_BIND_DEVICE_TYPE: + case SETTING_CONTROLS_NUMBER: + case SETTING_PATH_SYSTEM: + case SETTING_PATH_SRAM_DIRECTORY: + case SETTING_PATH_SAVESTATES_DIRECTORY: + case SETTING_PATH_DEFAULT_ROM_DIRECTORY: + case SETTING_AUDIO_CONTROL_RATE_DELTA: + case SETTING_EMU_AUDIO_MUTE: + case SETTING_REWIND_GRANULARITY: + case SETTING_REWIND_ENABLED: + case SETTING_VIDEO_CROP_OVERSCAN: + case SETTING_VIDEO_VSYNC: + case SETTING_REFRESH_RATE: + case SETTING_HW_TEXTURE_FILTER: + case SETTING_EMU_SHOW_DEBUG_INFO_MSG: + menu_set_settings_label(setting_text, sizeof(setting_text), &w, settings_lut[i]); + break; + case SETTING_CUSTOM_VIEWPORT: + case INGAME_MENU_SAVE_CONFIG: + case INGAME_MENU_CHANGE_LIBRETRO_CORE: + case INGAME_MENU_CHANGE_GAME: + case INGAME_MENU_SETTINGS_MODE: + case INGAME_MENU_PATH_OPTIONS_MODE: + case INGAME_MENU_INPUT_OPTIONS_MODE: + case INGAME_MENU_AUDIO_OPTIONS_MODE: + case INGAME_MENU_VIDEO_OPTIONS_MODE: + case INGAME_MENU_LOAD_GAME_HISTORY_MODE: +#ifdef HAVE_SHADER_MANAGER + case INGAME_MENU_SHADER_OPTIONS_MODE: +#endif + case INGAME_MENU_CORE_OPTIONS_MODE: + strlcpy(setting_text, "...", sizeof(setting_text)); + break; + } + + char setting_text_buf[256]; + menu_ticker_line(setting_text_buf, TICKER_LABEL_CHARS_MAX_PER_LINE, g_extern.frame_count / 15, setting_text, i == rgui->selection_ptr); + + if (!(j < NUM_ENTRY_PER_PAGE)) + { + j = 0; + item_page++; + } + + items_pages[i] = item_page; + j++; + + if (item_page != setting_page_number) + continue; + + y_increment += POSITION_Y_INCREMENT; + + font_parms.x = POSITION_X; + font_parms.y = y_increment; + font_parms.scale = FONT_SIZE_VARIABLE; + font_parms.color = (i == rgui->selection_ptr) ? YELLOW : WHITE; + + if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, text, &font_parms); + + font_parms.x = POSITION_X_CENTER; + font_parms.color = WHITE; + + if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, setting_text_buf, &font_parms); + + if (i != rgui->selection_ptr) + continue; + +#ifdef HAVE_MENU_PANEL + menu_panel->y = y_increment; +#endif + } + } + + if (render_history) + { + if (rom_history_size(rgui->history)) + { + float y_increment = POSITION_Y_START; + + y_increment += POSITION_Y_INCREMENT; + + font_parms.x = POSITION_X; + font_parms.y = y_increment; + font_parms.scale = CURRENT_PATH_FONT_SIZE; + font_parms.color = WHITE; + size_t opts = rom_history_size(rgui->history); + + for (size_t i = 0; i < opts; i++) + { + const char *path = NULL; + const char *core_path = NULL; + const char *core_name = NULL; + + rom_history_get_index(rgui->history, i, + &path, &core_path, &core_name); + + char path_short[PATH_MAX]; + fill_pathname(path_short, path_basename(path), "", sizeof(path_short)); + + char fill_buf[PATH_MAX]; + snprintf(fill_buf, sizeof(fill_buf), "%s (%s)", + path_short, core_name); + + /* not on same page? */ + if ((i / NUM_ENTRY_PER_PAGE) != (hist_opt_selected / NUM_ENTRY_PER_PAGE)) + continue; + +#ifdef HAVE_MENU_PANEL + //check if this is the currently selected option + if (i == hist_opt_selected) + menu_panel->y = font_parms.y; +#endif + + font_parms.x = POSITION_X; + font_parms.color = (hist_opt_selected == i) ? YELLOW : WHITE; + + if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, + fill_buf, &font_parms); + + font_parms.y += POSITION_Y_INCREMENT; + } + } + else if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, "No history available.", &font_parms); + } + + if (render_ingame_menu_resize && rgui->frame_buf_show) + { + char viewport[32]; + snprintf(viewport, sizeof(viewport), "Viewport X: #%d Y: %d (%dx%d)", g_extern.console.screen.viewports.custom_vp.x, g_extern.console.screen.viewports.custom_vp.y, g_extern.console.screen.viewports.custom_vp.width, + g_extern.console.screen.viewports.custom_vp.height); + + font_parms.x = POSITION_X; + font_parms.y = POSITION_Y_BEGIN; + font_parms.scale = HARDCODE_FONT_SIZE; + font_parms.color = WHITE; + + if (driver.video_poke->set_osd_msg) + driver.video_poke->set_osd_msg(driver.video_data, viewport, &font_parms); + } +} static int select_file(void *data, uint64_t action) { @@ -308,11 +1063,11 @@ static int select_file(void *data, uint64_t action) menu_texture = (struct texture_image*)calloc(1, sizeof(*menu_texture)); } texture_image_load(path, menu_texture); + rgui->width = menu_texture->width; + rgui->height = menu_texture->height; strlcpy(g_extern.menu_texture_path, path, sizeof(g_extern.menu_texture_path)); - if (driver.video_poke && driver.video_poke->set_texture_frame) - driver.video_poke->set_texture_frame(driver.video_data, menu_texture->pixels, - true, menu_texture->width, menu_texture->height, 1.0f); + rmenu_set_texture(rgui, true); break; case LIBRETRO_CHOICE: rarch_environment_cb(RETRO_ENVIRONMENT_SET_LIBRETRO_PATH, (void*)path); @@ -542,10 +1297,10 @@ void rgui_init_textures(void) texture_image_load("D:\\Media\\menuMainRomSelectPanel.png", menu_panel); #endif texture_image_load(g_extern.menu_texture_path, menu_texture); + rgui->width = menu_texture->width; + rgui->height = menu_texture->height; - if (driver.video_poke && driver.video_poke->set_texture_frame) - driver.video_poke->set_texture_frame(driver.video_data, menu_texture->pixels, - true, menu_texture->width, menu_texture->height, 1.0f); + rmenu_set_texture(rgui, true); } static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t action_ori) @@ -1391,7 +2146,7 @@ int rgui_input_postprocess(void *data, uint64_t old_state) return ret; } -static int rgui_iterate(void *data, unsigned action) +int rmenu_iterate(void *data, unsigned action) { rgui_handle_t *rgui = (rgui_handle_t*)data; rgui->menu_type = menu_stack_enum_array[stack_idx - 1]; @@ -1467,7 +2222,7 @@ static int rgui_iterate(void *data, unsigned action) } if (ret == 0) - render_text(rgui); + rmenu_render(rgui); if (ret == -1) menu_stack_pop(rgui->menu_type); @@ -1475,11 +2230,10 @@ static int rgui_iterate(void *data, unsigned action) return ret; } -static void* rgui_init(void) +static void* rmenu_init(void) { rgui_handle_t *rgui = (rgui_handle_t*)calloc(1, sizeof(*rgui)); - menu_texture = (struct texture_image*)calloc(1, sizeof(*menu_texture)); #ifdef HAVE_MENU_PANEL menu_panel = (struct texture_image*)calloc(1, sizeof(*menu_panel)); @@ -1527,7 +2281,7 @@ static void* rgui_init(void) return rgui; } -static void rgui_free(void *data) +static void rmenu_free(void *data) { #ifdef _XBOX1 #ifdef HAVE_MENU_PANEL @@ -1569,9 +2323,20 @@ static void rgui_free(void *data) #endif } +void rmenu_set_texture(void *data, bool enable) +{ + rgui_handle_t *rgui = (rgui_handle_t*)data; + + if (driver.video_poke && driver.video_poke->set_texture_enable) + driver.video_poke->set_texture_frame(driver.video_data, menu_texture->pixels, + enable, rgui->width, rgui->height, 1.0f); +} + const menu_ctx_driver_t menu_ctx_rmenu = { - rgui_iterate, - rgui_init, - rgui_free, + rmenu_set_texture, + NULL, + rmenu_render, + rmenu_init, + rmenu_free, "rmenu", }; diff --git a/frontend/menu/rmenu_xui.cpp b/frontend/menu/rmenu_xui.cpp index ee3a9110b7..f8ee54018d 100644 --- a/frontend/menu/rmenu_xui.cpp +++ b/frontend/menu/rmenu_xui.cpp @@ -1346,7 +1346,7 @@ static void ingame_menu_resize (void) { } -static int rgui_iterate(void *data, unsigned action) +int rmenu_xui_iterate(void *data, unsigned action) { (void)data; @@ -1411,7 +1411,9 @@ int rgui_input_postprocess(void *data, uint64_t old_state) } const menu_ctx_driver_t menu_ctx_rmenu_xui = { - rgui_iterate, + NULL, + NULL, + NULL, rgui_init, rgui_free, "rmenu_xui", diff --git a/frontend/menu/rmenudisp.c b/frontend/menu/rmenudisp.c deleted file mode 100644 index 01dec4b831..0000000000 --- a/frontend/menu/rmenudisp.c +++ /dev/null @@ -1,753 +0,0 @@ -#if defined(_XBOX1) -#define HARDCODE_FONT_SIZE 21 -#define FONT_SIZE_VARIABLE FONT_SIZE - -#define POSITION_X 60 -#define POSITION_X_CENTER (POSITION_X + 350) -#define POSITION_Y_START 80 -#define Y_POSITION 430 -#define POSITION_Y_BEGIN (POSITION_Y_START + POSITION_Y_INCREMENT) -#define POSITION_Y_INCREMENT 20 -#define COMMENT_POSITION_Y (Y_POSITION - ((POSITION_Y_INCREMENT/2) * 3)) -#define CORE_MSG_POSITION_X FONT_SIZE -#define CORE_MSG_POSITION_Y (MSG_PREV_NEXT_Y_POSITION + 0.01f) -#define CORE_MSG_FONT_SIZE FONT_SIZE -#define MSG_QUEUE_X_POSITION POSITION_X -#define MSG_QUEUE_Y_POSITION (Y_POSITION - ((POSITION_Y_INCREMENT/2) * 7) + 10) -#define MSG_QUEUE_FONT_SIZE HARDCODE_FONT_SIZE -#define MSG_PREV_NEXT_Y_POSITION 24 -#define CURRENT_PATH_Y_POSITION (POSITION_Y_START - ((POSITION_Y_INCREMENT/2))) -#define CURRENT_PATH_FONT_SIZE 21 - -#define FONT_SIZE 21 - -#define NUM_ENTRY_PER_PAGE 15 -#elif defined(__CELLOS_LV2__) -#define HARDCODE_FONT_SIZE 0.91f -#define FONT_SIZE_VARIABLE g_settings.video.font_size -#define POSITION_X 0.09f -#define POSITION_X_CENTER 0.5f -#define POSITION_Y_START 0.17f -#define POSITION_Y_INCREMENT 0.035f -#define POSITION_Y_BEGIN (POSITION_Y_START + POSITION_Y_INCREMENT) -#define COMMENT_POSITION_Y 0.82f -#define CORE_MSG_POSITION_X 0.3f -#define CORE_MSG_POSITION_Y 0.06f -#define CORE_MSG_FONT_SIZE COMMENT_POSITION_Y - -#define MSG_QUEUE_X_POSITION g_settings.video.msg_pos_x -#define MSG_QUEUE_Y_POSITION 0.90f -#define MSG_QUEUE_FONT_SIZE 1.03f - -#define MSG_PREV_NEXT_Y_POSITION 0.03f -#define CURRENT_PATH_Y_POSITION 0.15f -#define CURRENT_PATH_FONT_SIZE (g_settings.video.font_size) - -#define NUM_ENTRY_PER_PAGE 18 -#endif - -static void render_text(void *data) -{ - rgui_handle_t *rgui = (rgui_handle_t*)data; - font_params_t font_parms = {0}; - - char msg[128]; - char label[64]; - - font_parms.x = POSITION_X; - font_parms.y = CURRENT_PATH_Y_POSITION; - font_parms.scale = CURRENT_PATH_FONT_SIZE; - font_parms.color = WHITE; - - switch(rgui->menu_type) - { -#ifdef HAVE_SHADER_MANAGER - case SHADER_CHOICE: - case CGP_CHOICE: -#endif - case BORDER_CHOICE: - case LIBRETRO_CHOICE: - case PATH_SAVESTATES_DIR_CHOICE: - case PATH_DEFAULT_ROM_DIR_CHOICE: -#ifdef HAVE_XML - case PATH_CHEATS_DIR_CHOICE: -#endif - case PATH_SRAM_DIR_CHOICE: - case PATH_SYSTEM_DIR_CHOICE: - case CONFIG_CHOICE: - case FILE_BROWSER_MENU: - if (rgui->menu_type == LIBRETRO_CHOICE) - strlcpy(label, "CORE SELECTION", sizeof(label)); - else if (rgui->menu_type == CONFIG_CHOICE) - strlcpy(label, "CONFIG", sizeof(label)); - else - strlcpy(label, "PATH", sizeof(label)); - snprintf(msg, sizeof(msg), "%s %s", label, rgui->browser->current_dir.directory_path); - break; - case INGAME_MENU_LOAD_GAME_HISTORY: - strlcpy(msg, "LOAD HISTORY", sizeof(msg)); - break; - case INGAME_MENU: - strlcpy(msg, "MENU", sizeof(msg)); - break; - case INGAME_MENU_CORE_OPTIONS: - strlcpy(msg, "CORE OPTIONS", sizeof(msg)); - break; - case INGAME_MENU_VIDEO_OPTIONS: - case INGAME_MENU_VIDEO_OPTIONS_MODE: - strlcpy(msg, "VIDEO OPTIONS", sizeof(msg)); - break; -#ifdef HAVE_SHADER_MANAGER - case INGAME_MENU_SHADER_OPTIONS: - case INGAME_MENU_SHADER_OPTIONS_MODE: - strlcpy(msg, "SHADER OPTIONS", sizeof(msg)); - break; -#endif - case INGAME_MENU_INPUT_OPTIONS: - case INGAME_MENU_INPUT_OPTIONS_MODE: - strlcpy(msg, "INPUT OPTIONS", sizeof(msg)); - break; - case INGAME_MENU_CUSTOM_RATIO: - strlcpy(msg, "CUSTOM RATIO", sizeof(msg)); - break; - case INGAME_MENU_SETTINGS: - case INGAME_MENU_SETTINGS_MODE: - strlcpy(msg, "MENU SETTINGS", sizeof(msg)); - break; - case INGAME_MENU_AUDIO_OPTIONS: - case INGAME_MENU_AUDIO_OPTIONS_MODE: - strlcpy(msg, "AUDIO OPTIONS", sizeof(msg)); - break; - case INGAME_MENU_PATH_OPTIONS: - case INGAME_MENU_PATH_OPTIONS_MODE: - strlcpy(msg, "PATH OPTIONS", sizeof(msg)); - break; - } - - if (driver.video_poke->set_osd_msg && msg[0] != '\0') - driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms); - - font_parms.x = POSITION_X; - font_parms.y = CORE_MSG_POSITION_Y; - font_parms.scale = CORE_MSG_FONT_SIZE; - font_parms.color = WHITE; - - snprintf(msg, sizeof(msg), "%s - %s %s", PACKAGE_VERSION, rgui->info.library_name, rgui->info.library_version); - - if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, msg, &font_parms); - - bool render_browser = false; - bool render_settings = false; - bool render_history = false; - bool render_ingame_menu_resize = false; - bool render_core_options = false; - - switch(rgui->menu_type) - { - case FILE_BROWSER_MENU: - case LIBRETRO_CHOICE: - case CONFIG_CHOICE: -#ifdef HAVE_SHADER_MANAGER - case CGP_CHOICE: - case SHADER_CHOICE: -#endif - case BORDER_CHOICE: - case PATH_DEFAULT_ROM_DIR_CHOICE: - case PATH_SAVESTATES_DIR_CHOICE: - case PATH_SRAM_DIR_CHOICE: -#ifdef HAVE_XML - case PATH_CHEATS_DIR_CHOICE: -#endif - case PATH_SYSTEM_DIR_CHOICE: - render_browser = true; - break; - case INGAME_MENU_CUSTOM_RATIO: - render_ingame_menu_resize = true; - break; - case INGAME_MENU: - case INGAME_MENU_SETTINGS: - case INGAME_MENU_VIDEO_OPTIONS: - case INGAME_MENU_SHADER_OPTIONS: - case INGAME_MENU_AUDIO_OPTIONS: - case INGAME_MENU_INPUT_OPTIONS: - case INGAME_MENU_PATH_OPTIONS: - render_settings = true; - break; - case INGAME_MENU_LOAD_GAME_HISTORY: - render_history = true; - break; - case INGAME_MENU_CORE_OPTIONS: - render_core_options = true; - break; - } - - if (render_browser) - { - font_params_t font_parms = {0}; - font_parms.scale = FONT_SIZE_VARIABLE; - - if (rgui->browser->list->size) - { - unsigned file_count = rgui->browser->list->size; - unsigned current_index = 0; - unsigned page_number = 0; - unsigned page_base = 0; - unsigned i; - float y_increment = POSITION_Y_START; - - current_index = rgui->browser->current_dir.ptr; - page_number = current_index / NUM_ENTRY_PER_PAGE; - page_base = page_number * NUM_ENTRY_PER_PAGE; - - - for (i = page_base; i < file_count && i < page_base + NUM_ENTRY_PER_PAGE; ++i) - { - char fname[128]; - fill_pathname_base(fname, rgui->browser->list->elems[i].data, sizeof(fname)); - y_increment += POSITION_Y_INCREMENT; - -#ifdef HAVE_MENU_PANEL - //check if this is the currently selected file - if (strcmp(rgui->browser->current_dir.path, rgui->browser->list->elems[i].data) == 0) - menu_panel->y = y_increment; -#endif - - font_parms.x = POSITION_X; - font_parms.y = y_increment; - font_parms.color = i == current_index ? YELLOW : rgui->browser->list->elems[i].attr.b ? GREEN : WHITE; - - if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, fname, &font_parms); - } - } - else - { - char entry[128]; - font_parms.x = POSITION_X; - font_parms.y = POSITION_Y_START + POSITION_Y_INCREMENT; - font_parms.color = WHITE; - strlcpy(entry, "No entries available.", sizeof(entry)); - - if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, entry, &font_parms); - } - } - - if (render_core_options) - { - float y_increment = POSITION_Y_START; - - y_increment += POSITION_Y_INCREMENT; - - font_parms.x = POSITION_X; - font_parms.y = y_increment; - font_parms.scale = CURRENT_PATH_FONT_SIZE; - font_parms.color = WHITE; - - if (g_extern.system.core_options) - { - size_t opts = core_option_size(g_extern.system.core_options); - for (size_t i = 0; i < opts; i++, font_parms.y += POSITION_Y_INCREMENT) - { - char type_str[256]; - - /* not on same page? */ - if ((i / NUM_ENTRY_PER_PAGE) != (core_opt_selected / NUM_ENTRY_PER_PAGE)) - continue; - -#ifdef HAVE_MENU_PANEL - //check if this is the currently selected option - if (i == core_opt_selected) - menu_panel->y = font_parms.y; -#endif - - font_parms.x = POSITION_X; - font_parms.color = (core_opt_selected == i) ? YELLOW : WHITE; - - if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, - core_option_get_desc(g_extern.system.core_options, i), &font_parms); - - font_parms.x = POSITION_X_CENTER; - font_parms.color = WHITE; - - strlcpy(type_str, core_option_get_val(g_extern.system.core_options, i), sizeof(type_str)); - - if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, type_str, &font_parms); - } - } - else if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, "No options available.", &font_parms); - } - - if (render_settings) - { - float y_increment = POSITION_Y_START; - uint8_t i = 0; - uint8_t j = 0; - uint8_t item_page = 0; - - for(i = first_setting; i < max_settings; i++) - { - char text[PATH_MAX]; - char setting_text[PATH_MAX]; - unsigned w; - - strlcpy(setting_text, "", sizeof(setting_text)); - - switch (i) - { -#ifdef __CELLOS_LV2__ - case SETTING_CHANGE_RESOLUTION: - strlcpy(text, "Resolution", sizeof(text)); - break; - case SETTING_PAL60_MODE: - strlcpy(text, "PAL60 Mode", sizeof(text)); - if (g_extern.lifecycle_mode_state & (1ULL << MODE_VIDEO_PAL_TEMPORAL_ENABLE)) - strlcpy(setting_text, "ON", sizeof(setting_text)); - else - strlcpy(setting_text, "OFF", sizeof(setting_text)); - break; -#endif - case SETTING_EMU_SKIN: - strlcpy(text, "Menu Skin", sizeof(text)); - fill_pathname_base(setting_text, g_extern.menu_texture_path, sizeof(setting_text)); - break; - case SETTING_HW_TEXTURE_FILTER: - strlcpy(text, "Default Filter", sizeof(text)); - break; -#ifdef _XBOX1 - case SETTING_FLICKER_FILTER: - strlcpy(text, "Flicker Filter", sizeof(text)); - snprintf(setting_text, sizeof(setting_text), "%d", g_extern.console.screen.flicker_filter_index); - break; - case SETTING_SOFT_DISPLAY_FILTER: - strlcpy(text, "Soft Display Filter", sizeof(text)); - snprintf(setting_text, sizeof(setting_text), (g_extern.lifecycle_mode_state & (1ULL << MODE_VIDEO_SOFT_FILTER_ENABLE)) ? "ON" : "OFF"); - break; -#endif - case SETTING_REFRESH_RATE: - strlcpy(text, "Estimated Monitor FPS", sizeof(text)); - break; - case SETTING_VIDEO_VSYNC: - strlcpy(text, "VSync", sizeof(text)); - break; - case SETTING_VIDEO_CROP_OVERSCAN: - strlcpy(text, "Crop Overscan (reload)", sizeof(text)); - break; - case SETTING_TRIPLE_BUFFERING: - strlcpy(text, "Triple Buffering", sizeof(text)); - snprintf(setting_text, sizeof(setting_text), (g_extern.lifecycle_mode_state & (1ULL << MODE_VIDEO_TRIPLE_BUFFERING_ENABLE)) ? "ON" : "OFF"); - break; - case SETTING_SOUND_MODE: - strlcpy(text, "Sound Output", sizeof(text)); - switch(g_extern.console.sound.mode) - { - case SOUND_MODE_NORMAL: - strlcpy(setting_text, "Normal", sizeof(setting_text)); - break; -#ifdef HAVE_RSOUND - case SOUND_MODE_RSOUND: - strlcpy(setting_text, "RSound", sizeof(setting_text)); - break; -#endif -#ifdef HAVE_HEADSET - case SOUND_MODE_HEADSET: - strlcpy(setting_text, "USB/Bluetooth Headset", sizeof(setting_text)); - break; -#endif - default: - break; - } - break; -#ifdef HAVE_RSOUND - case SETTING_RSOUND_SERVER_IP_ADDRESS: - strlcpy(text, "RSound Server IP Address", sizeof(text)); - strlcpy(setting_text, g_settings.audio.device, sizeof(setting_text)); - break; -#endif - case SETTING_EMU_SHOW_DEBUG_INFO_MSG: - strlcpy(text, "Show Framerate", sizeof(text)); - break; - case SETTING_REWIND_ENABLED: - strlcpy(text, "Rewind", sizeof(text)); - break; - case SETTING_REWIND_GRANULARITY: - strlcpy(text, "Rewind Granularity", sizeof(text)); - break; - case SETTING_EMU_AUDIO_MUTE: - strlcpy(text, "Mute Audio", sizeof(text)); - break; - case SETTING_AUDIO_CONTROL_RATE_DELTA: - strlcpy(text, "Rate Control Delta", sizeof(text)); - break; -#ifdef _XBOX1 - case SETTING_EMU_AUDIO_SOUND_VOLUME_LEVEL: - strlcpy(text, "Volume Level", sizeof(text)); - snprintf(setting_text, sizeof(setting_text), g_extern.console.sound.volume_level ? "Loud" : "Normal"); - break; -#endif - case SETTING_ENABLE_CUSTOM_BGM: - strlcpy(text, "Custom BGM Option", sizeof(text)); - snprintf(setting_text, sizeof(setting_text), (g_extern.lifecycle_mode_state & (1ULL << MODE_AUDIO_CUSTOM_BGM_ENABLE)) ? "ON" : "OFF"); - break; - case SETTING_PATH_DEFAULT_ROM_DIRECTORY: - strlcpy(text, "Browser Directory", sizeof(text)); - break; - case SETTING_PATH_SAVESTATES_DIRECTORY: - strlcpy(text, "Savestate Directory", sizeof(text)); - break; - case SETTING_PATH_SRAM_DIRECTORY: - strlcpy(text, "Savefile Directory", sizeof(text)); - break; -#ifdef HAVE_XML - case SETTING_PATH_CHEATS: - strlcpy(text, "Cheatfile Directory", sizeof(text)); - strlcpy(setting_text, g_settings.cheat_database, sizeof(setting_text)); - break; -#endif - case SETTING_PATH_SYSTEM: - strlcpy(text, "System Directory", sizeof(text)); - break; - case SETTING_CONTROLS_NUMBER: - strlcpy(text, "Player", sizeof(text)); - break; - case SETTING_CONTROLS_BIND_DEVICE_TYPE: - strlcpy(text, "Device Type", sizeof(text)); - break; - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_B: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_Y: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_SELECT: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_START: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_UP: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_DOWN: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_LEFT: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_RIGHT: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_A: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_X: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_L: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_L2: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R2: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_L3: - case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R3: - { - unsigned id = i - FIRST_CONTROL_BIND; - struct platform_bind key_label; - strlcpy(key_label.desc, "Unknown", sizeof(key_label.desc)); - key_label.joykey = g_settings.input.binds[rgui->current_pad][id].joykey; - - if (driver.input->set_keybinds) - driver.input->set_keybinds(&key_label, 0, 0, 0, (1ULL << KEYBINDS_ACTION_GET_BIND_LABEL)); - strlcpy(text, g_settings.input.binds[rgui->current_pad][id].desc, sizeof(text)); - strlcpy(setting_text, key_label.desc, sizeof(setting_text)); - } - break; - case SETTING_CONTROLS_DEFAULT_ALL: - strlcpy(text, "DEFAULTS", sizeof(text)); - break; - case INGAME_MENU_LOAD_STATE: - strlcpy(text, "Load State", sizeof(text)); - snprintf(setting_text, sizeof(setting_text), "%d", g_extern.state_slot); - break; - case INGAME_MENU_SAVE_STATE: - strlcpy(text, "Save State", sizeof(text)); - snprintf(setting_text, sizeof(setting_text), "%d", g_extern.state_slot); - break; - case SETTING_ASPECT_RATIO: - strlcpy(text, "Aspect Ratio", sizeof(text)); - break; - case SETTING_ROTATION: - strlcpy(text, "Rotation", sizeof(text)); - break; - case SETTING_CUSTOM_VIEWPORT: - strlcpy(text, "Custom Ratio", sizeof(text)); - break; - case INGAME_MENU_CORE_OPTIONS_MODE: - strlcpy(text, "Core Options", sizeof(text)); - break; -#ifdef HAVE_SHADER_MANAGER - case INGAME_MENU_SHADER_OPTIONS_MODE: - strlcpy(text, "Shader Options", sizeof(text)); - break; -#endif - case INGAME_MENU_LOAD_GAME_HISTORY_MODE: - strlcpy(text, "Load Game (History)", sizeof(text)); - break; - case INGAME_MENU_VIDEO_OPTIONS_MODE: - strlcpy(text, "Video Options", sizeof(text)); - break; - case INGAME_MENU_AUDIO_OPTIONS_MODE: - strlcpy(text, "Audio Options", sizeof(text)); - break; - case INGAME_MENU_INPUT_OPTIONS_MODE: - strlcpy(text, "Input Options", sizeof(text)); - break; - case INGAME_MENU_PATH_OPTIONS_MODE: - strlcpy(text, "Path Options", sizeof(text)); - break; - case INGAME_MENU_SETTINGS_MODE: - strlcpy(text, "Settings", sizeof(text)); - break; - case INGAME_MENU_SCREENSHOT_MODE: - strlcpy(text, "Take Screenshot", sizeof(text)); - break; - case INGAME_MENU_RESET: - strlcpy(text, "Restart Game", sizeof(text)); - break; - case INGAME_MENU_RETURN_TO_GAME: - strlcpy(text, "Resume Game", sizeof(text)); - break; - case INGAME_MENU_CHANGE_GAME: - snprintf(text, sizeof(text), "Load Game (%s)", - rgui->info.library_name ? rgui->info.library_name : g_extern.system.info.library_name); - break; - case INGAME_MENU_CHANGE_LIBRETRO_CORE: - strlcpy(text, "Core", sizeof(text)); - break; -#ifdef HAVE_MULTIMAN - case INGAME_MENU_RETURN_TO_MULTIMAN: - strlcpy(text, "Return to multiMAN", sizeof(text)); - break; -#endif - case INGAME_MENU_CONFIG: - strlcpy(text, "RetroArch Config", sizeof(text)); - break; - case INGAME_MENU_SAVE_CONFIG: - strlcpy(text, "Save Config", sizeof(text)); - break; - case INGAME_MENU_QUIT_RETROARCH: - strlcpy(text, "Quit RetroArch", sizeof(text)); - break; - default: - break; -#ifdef HAVE_SHADER_MANAGER - case SHADERMAN_LOAD_CGP: - strlcpy(text, "Load Shader Preset", sizeof(text)); - break; - case SHADERMAN_SAVE_CGP: - strlcpy(text, "Save Shader Preset", sizeof(text)); - break; - case SHADERMAN_SHADER_PASSES: - strlcpy(text, "Shader Passes", sizeof(text)); - snprintf(setting_text, sizeof(setting_text), "%u", rgui->shader.passes); - break; - case SHADERMAN_APPLY_CHANGES: - strlcpy(text, "Apply Shader Changes", sizeof(text)); - break; - case SHADERMAN_SHADER_0: - case SHADERMAN_SHADER_1: - case SHADERMAN_SHADER_2: - case SHADERMAN_SHADER_3: - case SHADERMAN_SHADER_4: - case SHADERMAN_SHADER_5: - case SHADERMAN_SHADER_6: - case SHADERMAN_SHADER_7: - { - char type_str[256]; - uint8_t index = (i - SHADERMAN_SHADER_0) / 3; - if (*rgui->shader.pass[index].source.cg) - fill_pathname_base(type_str, - rgui->shader.pass[index].source.cg, sizeof(type_str)); - else - strlcpy(type_str, "N/A", sizeof(type_str)); - snprintf(text, sizeof(text), "Shader #%d", index); - strlcpy(setting_text, type_str, sizeof(setting_text)); - } - break; - case SHADERMAN_SHADER_0_FILTER: - case SHADERMAN_SHADER_1_FILTER: - case SHADERMAN_SHADER_2_FILTER: - case SHADERMAN_SHADER_3_FILTER: - case SHADERMAN_SHADER_4_FILTER: - case SHADERMAN_SHADER_5_FILTER: - case SHADERMAN_SHADER_6_FILTER: - case SHADERMAN_SHADER_7_FILTER: - { - char type_str[256]; - uint8_t index = (i - SHADERMAN_SHADER_0) / 3; - snprintf(text, sizeof(text), "Shader #%d filter", index); - shader_manager_get_str_filter(type_str, sizeof(type_str), index); - strlcpy(setting_text, type_str, sizeof(setting_text)); - } - break; - case SHADERMAN_SHADER_0_SCALE: - case SHADERMAN_SHADER_1_SCALE: - case SHADERMAN_SHADER_2_SCALE: - case SHADERMAN_SHADER_3_SCALE: - case SHADERMAN_SHADER_4_SCALE: - case SHADERMAN_SHADER_5_SCALE: - case SHADERMAN_SHADER_6_SCALE: - case SHADERMAN_SHADER_7_SCALE: - { - char type_str[256]; - uint8_t index = (i - SHADERMAN_SHADER_0) / 3; - unsigned scale = rgui->shader.pass[index].fbo.scale_x; - - snprintf(text, sizeof(text), "Shader #%d scale", index); - - if (!scale) - strlcpy(type_str, "Don't care", sizeof(type_str)); - else - snprintf(type_str, sizeof(type_str), "%ux", scale); - - strlcpy(setting_text, type_str, sizeof(setting_text)); - } - break; -#endif - } - - switch (i) - { -#ifdef __CELLOS_LV2__ - case SETTING_CHANGE_RESOLUTION: -#endif - case INGAME_MENU_CONFIG: - case SETTING_ROTATION: - case SETTING_ASPECT_RATIO: - case SETTING_CONTROLS_BIND_DEVICE_TYPE: - case SETTING_CONTROLS_NUMBER: - case SETTING_PATH_SYSTEM: - case SETTING_PATH_SRAM_DIRECTORY: - case SETTING_PATH_SAVESTATES_DIRECTORY: - case SETTING_PATH_DEFAULT_ROM_DIRECTORY: - case SETTING_AUDIO_CONTROL_RATE_DELTA: - case SETTING_EMU_AUDIO_MUTE: - case SETTING_REWIND_GRANULARITY: - case SETTING_REWIND_ENABLED: - case SETTING_VIDEO_CROP_OVERSCAN: - case SETTING_VIDEO_VSYNC: - case SETTING_REFRESH_RATE: - case SETTING_HW_TEXTURE_FILTER: - case SETTING_EMU_SHOW_DEBUG_INFO_MSG: - menu_set_settings_label(setting_text, sizeof(setting_text), &w, settings_lut[i]); - break; - case SETTING_CUSTOM_VIEWPORT: - case INGAME_MENU_SAVE_CONFIG: - case INGAME_MENU_CHANGE_LIBRETRO_CORE: - case INGAME_MENU_CHANGE_GAME: - case INGAME_MENU_SETTINGS_MODE: - case INGAME_MENU_PATH_OPTIONS_MODE: - case INGAME_MENU_INPUT_OPTIONS_MODE: - case INGAME_MENU_AUDIO_OPTIONS_MODE: - case INGAME_MENU_VIDEO_OPTIONS_MODE: - case INGAME_MENU_LOAD_GAME_HISTORY_MODE: -#ifdef HAVE_SHADER_MANAGER - case INGAME_MENU_SHADER_OPTIONS_MODE: -#endif - case INGAME_MENU_CORE_OPTIONS_MODE: - strlcpy(setting_text, "...", sizeof(setting_text)); - break; - } - - char setting_text_buf[256]; - menu_ticker_line(setting_text_buf, TICKER_LABEL_CHARS_MAX_PER_LINE, g_extern.frame_count / 15, setting_text, i == rgui->selection_ptr); - - if (!(j < NUM_ENTRY_PER_PAGE)) - { - j = 0; - item_page++; - } - - items_pages[i] = item_page; - j++; - - if (item_page != setting_page_number) - continue; - - y_increment += POSITION_Y_INCREMENT; - - font_parms.x = POSITION_X; - font_parms.y = y_increment; - font_parms.scale = FONT_SIZE_VARIABLE; - font_parms.color = (i == rgui->selection_ptr) ? YELLOW : WHITE; - - if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, text, &font_parms); - - font_parms.x = POSITION_X_CENTER; - font_parms.color = WHITE; - - if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, setting_text_buf, &font_parms); - - if (i != rgui->selection_ptr) - continue; - -#ifdef HAVE_MENU_PANEL - menu_panel->y = y_increment; -#endif - } - } - - if (render_history) - { - if (rom_history_size(rgui->history)) - { - float y_increment = POSITION_Y_START; - - y_increment += POSITION_Y_INCREMENT; - - font_parms.x = POSITION_X; - font_parms.y = y_increment; - font_parms.scale = CURRENT_PATH_FONT_SIZE; - font_parms.color = WHITE; - size_t opts = rom_history_size(rgui->history); - - for (size_t i = 0; i < opts; i++) - { - const char *path = NULL; - const char *core_path = NULL; - const char *core_name = NULL; - - rom_history_get_index(rgui->history, i, - &path, &core_path, &core_name); - - char path_short[PATH_MAX]; - fill_pathname(path_short, path_basename(path), "", sizeof(path_short)); - - char fill_buf[PATH_MAX]; - snprintf(fill_buf, sizeof(fill_buf), "%s (%s)", - path_short, core_name); - - /* not on same page? */ - if ((i / NUM_ENTRY_PER_PAGE) != (hist_opt_selected / NUM_ENTRY_PER_PAGE)) - continue; - -#ifdef HAVE_MENU_PANEL - //check if this is the currently selected option - if (i == hist_opt_selected) - menu_panel->y = font_parms.y; -#endif - - font_parms.x = POSITION_X; - font_parms.color = (hist_opt_selected == i) ? YELLOW : WHITE; - - if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, - fill_buf, &font_parms); - - font_parms.y += POSITION_Y_INCREMENT; - } - } - else if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, "No history available.", &font_parms); - } - - if (render_ingame_menu_resize && rgui->frame_buf_show) - { - char viewport[32]; - snprintf(viewport, sizeof(viewport), "Viewport X: #%d Y: %d (%dx%d)", g_extern.console.screen.viewports.custom_vp.x, g_extern.console.screen.viewports.custom_vp.y, g_extern.console.screen.viewports.custom_vp.width, - g_extern.console.screen.viewports.custom_vp.height); - - font_parms.x = POSITION_X; - font_parms.y = POSITION_Y_BEGIN; - font_parms.scale = HARDCODE_FONT_SIZE; - font_parms.color = WHITE; - - if (driver.video_poke->set_osd_msg) - driver.video_poke->set_osd_msg(driver.video_data, viewport, &font_parms); - } -}