mirror of
https://github.com/libretro/RetroArch.git
synced 2025-02-18 00:18:22 +00:00
(RGUI) Turns rgui.c into a raster driver for common
menu code - rmenu.c and rmenu_xui.cpp will need to be adapted accordingly
This commit is contained in:
parent
46099c5ca7
commit
6bc239abf7
@ -22,6 +22,7 @@
|
||||
#include <ctype.h>
|
||||
#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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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*);
|
||||
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
};
|
||||
|
@ -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",
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user