(RMenu) Rewritten ingame menu

This commit is contained in:
twinaphex 2013-04-01 09:18:30 +02:00
parent 6f8a008d1b
commit 5d3949c610
2 changed files with 293 additions and 333 deletions

View File

@ -42,30 +42,6 @@
#define EXT_CGP_PRESETS "cgp|CGP" #define EXT_CGP_PRESETS "cgp|CGP"
#define EXT_INPUT_PRESETS "cfg|CFG" #define EXT_INPUT_PRESETS "cfg|CFG"
enum {
MENU_ITEM_LOAD_STATE = 0,
MENU_ITEM_SAVE_STATE,
MENU_ITEM_KEEP_ASPECT_RATIO,
MENU_ITEM_OVERSCAN_AMOUNT,
MENU_ITEM_ORIENTATION,
#ifdef HAVE_FBO
MENU_ITEM_SCALE_FACTOR,
#endif
MENU_ITEM_RESIZE_MODE,
MENU_ITEM_FRAME_ADVANCE,
MENU_ITEM_SCREENSHOT_MODE,
MENU_ITEM_RESET,
MENU_ITEM_RETURN_TO_GAME,
MENU_ITEM_RETURN_TO_MENU,
MENU_ITEM_CHANGE_LIBRETRO,
#ifdef HAVE_MULTIMAN
MENU_ITEM_RETURN_TO_MULTIMAN,
#endif
MENU_ITEM_QUIT_RARCH,
MENU_ITEM_LAST
};
static bool set_libretro_core_as_launch; static bool set_libretro_core_as_launch;
filebrowser_t *browser; filebrowser_t *browser;
@ -721,6 +697,85 @@ static void populate_setting_item(void *data, unsigned input)
strlcpy(current_item->comment, "INFO - Save the current video settings to a [CG Preset] (CGP) file.", sizeof(current_item->comment)); strlcpy(current_item->comment, "INFO - Save the current video settings to a [CG Preset] (CGP) file.", sizeof(current_item->comment));
break; break;
#endif #endif
case INGAME_MENU_LOAD_STATE:
strlcpy(current_item->text, "Load State", sizeof(current_item->text));
snprintf(current_item->setting_text, sizeof(current_item->setting_text), "%d", g_extern.state_slot);
strlcpy(current_item->comment, "Load from current state slot.", sizeof(current_item->comment));
break;
case INGAME_MENU_SAVE_STATE:
strlcpy(current_item->text, "Save State", sizeof(current_item->text));
snprintf(current_item->setting_text, sizeof(current_item->setting_text), "%d", g_extern.state_slot);
strlcpy(current_item->comment, "Save to current state slot.", sizeof(current_item->comment));
break;
case INGAME_MENU_ASPECT_RATIO:
strlcpy(current_item->text, "Aspect Ratio", sizeof(current_item->text));
strlcpy(current_item->setting_text, aspectratio_lut[g_settings.video.aspect_ratio_idx].name, sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Change the aspect ratio of the screen.", sizeof(current_item->comment));
break;
case INGAME_MENU_OVERSCAN:
strlcpy(current_item->text, "Overscan", sizeof(current_item->text));
snprintf(current_item->setting_text, sizeof(current_item->setting_text), "%f", g_extern.console.screen.overscan_amount);
strlcpy(current_item->comment, "Change overscan correction.", sizeof(current_item->comment));
break;
case INGAME_MENU_ROTATION:
strlcpy(current_item->text, "Rotation", sizeof(current_item->text));
strlcpy(current_item->setting_text, rotation_lut[g_extern.console.screen.orientation], sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Change orientation of the screen.", sizeof(current_item->comment));
break;
#ifdef HAVE_FBO
case INGAME_MENU_SCALE_FACTOR:
strlcpy(current_item->text, "Scaling Factor", sizeof(current_item->text));
snprintf(current_item->setting_text, sizeof(current_item->setting_text), "%fx (X) / %fx (Y)", g_settings.video.fbo.scale_x, g_settings.video.fbo.scale_y);
strlcpy(current_item->comment, "Change scaling of the screen.", sizeof(current_item->comment));
break;
#endif
case INGAME_MENU_RESIZE_MODE:
strlcpy(current_item->text, "Resize Mode", sizeof(current_item->text));
strlcpy(current_item->setting_text, "", sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Allows you to resize the screen.", sizeof(current_item->comment));
break;
case INGAME_MENU_FRAME_ADVANCE:
strlcpy(current_item->text, "Frame Advance", sizeof(current_item->text));
strlcpy(current_item->setting_text, "", sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Press a button to step one frame.", sizeof(current_item->comment));
break;
case INGAME_MENU_SCREENSHOT_MODE:
strlcpy(current_item->text, "Screenshot Mode", sizeof(current_item->text));
strlcpy(current_item->setting_text, "", sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Take a screenshot.", sizeof(current_item->comment));
break;
case INGAME_MENU_RESET:
strlcpy(current_item->text, "Reset", sizeof(current_item->text));
strlcpy(current_item->setting_text, "", sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Reset the game.", sizeof(current_item->comment));
break;
case INGAME_MENU_RETURN_TO_GAME:
strlcpy(current_item->text, "Return to Game", sizeof(current_item->text));
strlcpy(current_item->setting_text, "", sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Change the currently loaded game.", sizeof(current_item->comment));
break;
case INGAME_MENU_CHANGE_GAME:
strlcpy(current_item->text, "Change Game", sizeof(current_item->text));
strlcpy(current_item->setting_text, "", sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Select another game.", sizeof(current_item->comment));
break;
case INGAME_MENU_CHANGE_LIBRETRO_CORE:
strlcpy(current_item->text, "Change libretro core", sizeof(current_item->text));
strlcpy(current_item->setting_text, "", sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Choose another libretro core.", sizeof(current_item->comment));
break;
#ifdef HAVE_MULTIMAN
case INGAME_MENU_RETURN_TO_MULTIMAN:
strlcpy(current_item->text, "Return to multiMAN", sizeof(current_item->text));
strlcpy(current_item->setting_text, "", sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Quit RetroArch and return to multiMAN.", sizeof(current_item->comment));
break;
#endif
case INGAME_MENU_QUIT_RETROARCH:
strlcpy(current_item->text, "Quit RetroArch", sizeof(current_item->text));
strlcpy(current_item->setting_text, "", sizeof(current_item->setting_text));
strlcpy(current_item->comment, "Quit RetroArch.", sizeof(current_item->comment));
break;
default: default:
break; break;
} }
@ -1575,6 +1630,7 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
if (input & (1ULL << RMENU_DEVICE_NAV_START)) if (input & (1ULL << RMENU_DEVICE_NAV_START))
g_settings.video.font_size = 1.0f; g_settings.video.font_size = 1.0f;
break; break;
case INGAME_MENU_ASPECT_RATIO:
case SETTING_KEEP_ASPECT_RATIO: case SETTING_KEEP_ASPECT_RATIO:
if (input & (1ULL << RMENU_DEVICE_NAV_LEFT)) if (input & (1ULL << RMENU_DEVICE_NAV_LEFT))
{ {
@ -1653,6 +1709,7 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
} }
break; break;
case SETTING_SCALE_FACTOR: case SETTING_SCALE_FACTOR:
case INGAME_MENU_SCALE_FACTOR:
if (input & (1ULL << RMENU_DEVICE_NAV_LEFT)) if (input & (1ULL << RMENU_DEVICE_NAV_LEFT))
{ {
if (g_settings.video.render_to_texture) if (g_settings.video.render_to_texture)
@ -2262,6 +2319,118 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
driver.input->set_keybinds(driver.input_data, g_settings.input.device[currently_selected_controller_menu], currently_selected_controller_menu, 0, driver.input->set_keybinds(driver.input_data, g_settings.input.device[currently_selected_controller_menu], currently_selected_controller_menu, 0,
(1ULL << KEYBINDS_ACTION_SET_DEFAULT_BINDS)); (1ULL << KEYBINDS_ACTION_SET_DEFAULT_BINDS));
break; break;
case INGAME_MENU_LOAD_STATE:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
rarch_load_state();
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
if (input & (1ULL << RMENU_DEVICE_NAV_LEFT))
rarch_state_slot_decrease();
if (input & (1ULL << RMENU_DEVICE_NAV_RIGHT))
rarch_state_slot_increase();
break;
case INGAME_MENU_SAVE_STATE:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
rarch_save_state();
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
if (input & (1ULL << RMENU_DEVICE_NAV_LEFT))
rarch_state_slot_decrease();
if (input & (1ULL << RMENU_DEVICE_NAV_RIGHT))
rarch_state_slot_increase();
break;
case INGAME_MENU_ROTATION:
if (input & (1ULL << RMENU_DEVICE_NAV_LEFT))
{
settings_set(1ULL << S_ROTATION_DECREMENT);
driver.video->set_rotation(NULL, g_extern.console.screen.orientation);
}
if ((input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
{
settings_set(1ULL << S_ROTATION_INCREMENT);
driver.video->set_rotation(NULL, g_extern.console.screen.orientation);
}
if (input & (1ULL << RMENU_DEVICE_NAV_START))
{
settings_set(1ULL << S_DEF_ROTATION);
driver.video->set_rotation(NULL, g_extern.console.screen.orientation);
}
break;
case INGAME_MENU_FRAME_ADVANCE:
if ((input & (1ULL << RMENU_DEVICE_NAV_B)) || (input & (1ULL << RMENU_DEVICE_NAV_R2)) || (input & (1ULL << RMENU_DEVICE_NAV_L2)))
{
g_extern.lifecycle_state |= (1ULL << RARCH_FRAMEADVANCE);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
settings_set(1ULL << S_FRAME_ADVANCE);
return -1;
}
break;
case INGAME_MENU_RESIZE_MODE:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
menu_stack_push(INGAME_MENU_RESIZE);
break;
case INGAME_MENU_SCREENSHOT_MODE:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
menu_stack_push(INGAME_MENU_SCREENSHOT);
break;
case INGAME_MENU_CHANGE_GAME:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
break;
case INGAME_MENU_RESET:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
rarch_game_reset();
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
break;
case INGAME_MENU_CHANGE_LIBRETRO_CORE:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
menu_stack_push(LIBRETRO_CHOICE);
filebrowser_set_root_and_ext(filebrowser, EXT_EXECUTABLES, default_paths.core_dir);
set_libretro_core_as_launch = true;
}
break;
#ifdef HAVE_MULTIMAN
case INGAME_MENU_RETURN_TO_MULTIMAN:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN_MULTIMAN);
return -1;
}
break;
#endif
case INGAME_MENU_QUIT_RETROARCH:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
break;
} }
return 0; return 0;
@ -2384,8 +2553,6 @@ static int select_setting(uint8_t menu_type, uint64_t input)
if (items_pages[selected] != page_number) if (items_pages[selected] != page_number)
page_number = items_pages[selected]; page_number = items_pages[selected];
set_setting_action(menu_type, selected, input);
} }
if (input & (1ULL << RMENU_DEVICE_NAV_DOWN)) if (input & (1ULL << RMENU_DEVICE_NAV_DOWN))
@ -2396,8 +2563,6 @@ static int select_setting(uint8_t menu_type, uint64_t input)
selected = first_setting; selected = first_setting;
if (items_pages[selected] != page_number) if (items_pages[selected] != page_number)
page_number = items_pages[selected]; page_number = items_pages[selected];
set_setting_action(menu_type, selected, input);
} }
/* back to ROM menu if CIRCLE is pressed */ /* back to ROM menu if CIRCLE is pressed */
@ -2983,25 +3148,76 @@ static int ingame_menu_screenshot(uint8_t menu_type, uint64_t input)
return 0; return 0;
} }
#define MENU_ITEM_SELECTED(index) (menuitem_colors[index])
static int ingame_menu(uint8_t menu_type, uint64_t input) static int ingame_menu(uint8_t menu_type, uint64_t input)
{ {
static uint8_t first_setting = FIRST_INGAME_MENU_SETTING;
static uint8_t selected = FIRST_INGAME_MENU_SETTING;
static uint8_t page_number = 0;
uint8_t items_pages[SETTING_LAST] = {0};
uint8_t max_settings = MAX_NO_OF_INGAME_MENU_SETTINGS;
int ret = 0; int ret = 0;
DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data;
char strw_buffer[256];
unsigned menuitem_colors[MENU_ITEM_LAST];
static unsigned menu_idx = 0;
font_params_t font_parms = {0}; font_params_t font_parms = {0};
filebrowser_t *filebrowser = tmpBrowser;
rmenu_default_positions_t default_pos; rmenu_default_positions_t default_pos;
menu_set_default_pos(&default_pos); menu_set_default_pos(&default_pos);
for(int i = 0; i < MENU_ITEM_LAST; i++) uint8_t i = 0;
menuitem_colors[i] = WHITE; uint8_t j = 0;
uint8_t item_page = 0;
menuitem_colors[menu_idx] = RED; for(i = first_setting; i < max_settings; i++)
{
item item;
populate_setting_item(&item, i);
if (!(j < default_pos.entries_per_page))
{
j = 0;
item_page++;
}
item.page = item_page;
items_pages[i] = item_page;
j++;
if (item.page != page_number)
continue;
default_pos.starting_y_position += default_pos.y_position_increment;
font_parms.x = default_pos.x_position;
font_parms.y = default_pos.starting_y_position;
font_parms.scale = default_pos.variable_font_size;
font_parms.color = selected == item.enum_id ? YELLOW : WHITE;
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, item.text, &font_parms);
font_parms.x = default_pos.x_position_center;
font_parms.color = WHITE;
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, item.setting_text, &font_parms);
if (item.enum_id != selected)
continue;
rarch_position_t position = {0};
position.x = default_pos.x_position;
position.y = default_pos.starting_y_position;
device_ptr->ctx_driver->rmenu_draw_panel(&position);
font_parms.x = default_pos.x_position;
font_parms.y = default_pos.comment_y_position;
font_parms.scale = default_pos.font_size;
font_parms.color = WHITE;
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, item.comment, &font_parms);
}
if (input & (1ULL << RMENU_DEVICE_NAV_A)) if (input & (1ULL << RMENU_DEVICE_NAV_A))
{ {
@ -3010,311 +3226,34 @@ static int ingame_menu(uint8_t menu_type, uint64_t input)
return -1; return -1;
} }
switch(menu_idx)
{
case MENU_ITEM_LOAD_STATE:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
rarch_load_state();
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
if (input & (1ULL << RMENU_DEVICE_NAV_LEFT))
rarch_state_slot_decrease();
if (input & (1ULL << RMENU_DEVICE_NAV_RIGHT))
rarch_state_slot_increase();
strlcpy(strw_buffer, "Load from current state slot.", sizeof(strw_buffer));
break;
case MENU_ITEM_SAVE_STATE:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
rarch_save_state();
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
if (input & (1ULL << RMENU_DEVICE_NAV_LEFT))
rarch_state_slot_decrease();
if (input & (1ULL << RMENU_DEVICE_NAV_RIGHT))
rarch_state_slot_increase();
strlcpy(strw_buffer, "Save to current state slot.", sizeof(strw_buffer));
break;
case MENU_ITEM_KEEP_ASPECT_RATIO:
ret = set_setting_action(menu_type, SETTING_KEEP_ASPECT_RATIO, input);
if (ret != 0)
return ret;
strlcpy(strw_buffer, "Change the aspect ratio of the screen.", sizeof(strw_buffer));
break;
case MENU_ITEM_OVERSCAN_AMOUNT:
ret = set_setting_action(menu_type, SETTING_HW_OVERSCAN_AMOUNT, input);
if (ret != 0)
return ret;
strlcpy(strw_buffer, "Change overscan correction.", sizeof(strw_buffer));
break;
case MENU_ITEM_ORIENTATION:
if (input & (1ULL << RMENU_DEVICE_NAV_LEFT))
{
settings_set(1ULL << S_ROTATION_DECREMENT);
driver.video->set_rotation(NULL, g_extern.console.screen.orientation);
}
if ((input & (1ULL << RMENU_DEVICE_NAV_RIGHT)) || (input & (1ULL << RMENU_DEVICE_NAV_B)))
{
settings_set(1ULL << S_ROTATION_INCREMENT);
driver.video->set_rotation(NULL, g_extern.console.screen.orientation);
}
if (input & (1ULL << RMENU_DEVICE_NAV_START))
{
settings_set(1ULL << S_DEF_ROTATION);
driver.video->set_rotation(NULL, g_extern.console.screen.orientation);
}
strlcpy(strw_buffer, "Change orientation of the screen.", sizeof(strw_buffer));
break;
#ifdef HAVE_FBO
case MENU_ITEM_SCALE_FACTOR:
ret = set_setting_action(menu_type, SETTING_SCALE_FACTOR, input);
if (ret != 0)
return ret;
strlcpy(strw_buffer, "Change scaling of the screen.", sizeof(strw_buffer));
break;
#endif
case MENU_ITEM_FRAME_ADVANCE:
if ((input & (1ULL << RMENU_DEVICE_NAV_B)) || (input & (1ULL << RMENU_DEVICE_NAV_R2)) || (input & (1ULL << RMENU_DEVICE_NAV_L2)))
{
g_extern.lifecycle_state |= (1ULL << RARCH_FRAMEADVANCE);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
settings_set(1ULL << S_FRAME_ADVANCE);
menu_idx = MENU_ITEM_FRAME_ADVANCE;
return -1;
}
strlcpy(strw_buffer, "Press a button to step one frame.", sizeof(strw_buffer));
break;
case MENU_ITEM_RESIZE_MODE:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
menu_stack_push(INGAME_MENU_RESIZE);
strlcpy(strw_buffer, "Allows you to resize the screen.", sizeof(strw_buffer));
break;
case MENU_ITEM_SCREENSHOT_MODE:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
menu_stack_push(INGAME_MENU_SCREENSHOT);
strlcpy(strw_buffer, "Take a screenshot.", sizeof(strw_buffer));
break;
case MENU_ITEM_RETURN_TO_GAME:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
strlcpy(strw_buffer, "Change the currently loaded game.", sizeof(strw_buffer));
break;
case MENU_ITEM_RESET:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
rarch_game_reset();
g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
strlcpy(strw_buffer, "Reset the game.", sizeof(strw_buffer));
break;
case MENU_ITEM_RETURN_TO_MENU:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
menu_idx = 0;
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return 0;
}
strlcpy(strw_buffer, "Return to the menu.", sizeof(strw_buffer));
break;
case MENU_ITEM_CHANGE_LIBRETRO:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
menu_stack_push(LIBRETRO_CHOICE);
filebrowser_set_root_and_ext(filebrowser, EXT_EXECUTABLES, default_paths.core_dir);
set_libretro_core_as_launch = true;
}
strlcpy(strw_buffer, "Choose another libretro core.", sizeof(strw_buffer));
break;
#ifdef HAVE_MULTIMAN
case MENU_ITEM_RETURN_TO_MULTIMAN:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN_MULTIMAN);
return -1;
}
strlcpy(strw_buffer, "Quit RetroArch and return to multiMAN.", sizeof(strw_buffer));
break;
#endif
case MENU_ITEM_QUIT_RARCH:
if (input & (1ULL << RMENU_DEVICE_NAV_B))
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
strlcpy(strw_buffer, "Quit RetroArch.", sizeof(strw_buffer));
break;
}
if (input & (1ULL << RMENU_DEVICE_NAV_UP)) if (input & (1ULL << RMENU_DEVICE_NAV_UP))
{ {
if (menu_idx > 0) if (selected == first_setting)
menu_idx--; selected = max_settings-1;
else else
menu_idx = MENU_ITEM_LAST - 1; selected--;
}
if (items_pages[selected] != page_number)
page_number = items_pages[selected];
}
if (input & (1ULL << RMENU_DEVICE_NAV_DOWN)) if (input & (1ULL << RMENU_DEVICE_NAV_DOWN))
{ {
if (menu_idx < (MENU_ITEM_LAST-1)) selected++;
menu_idx++;
else if (selected >= max_settings)
menu_idx = 0; selected = first_setting;
if (items_pages[selected] != page_number)
page_number = items_pages[selected];
} }
ret = set_setting_action(menu_type, selected, input);
if (ret != 0)
return ret;
display_menubar(menu_type); display_menubar(menu_type);
font_parms.x = default_pos.x_position;
font_parms.y = default_pos.comment_y_position;
font_parms.scale = default_pos.font_size;
font_parms.color = WHITE;
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, strw_buffer, &font_parms);
snprintf(strw_buffer, sizeof(strw_buffer), "Load State #%d", g_extern.state_slot);
font_parms.y = default_pos.y_position;
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_LOAD_STATE);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, strw_buffer, &font_parms);
snprintf(strw_buffer, sizeof(strw_buffer), "Save State #%d", g_extern.state_slot);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_SAVE_STATE);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_SAVE_STATE);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, strw_buffer, &font_parms);
snprintf(strw_buffer, sizeof(strw_buffer), "Aspect Ratio: %s",
aspectratio_lut[g_settings.video.aspect_ratio_idx].name);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_KEEP_ASPECT_RATIO);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_KEEP_ASPECT_RATIO);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, strw_buffer, &font_parms);
snprintf(strw_buffer, sizeof(strw_buffer), "Overscan: %f", g_extern.console.screen.overscan_amount);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_OVERSCAN_AMOUNT);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_OVERSCAN_AMOUNT);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, strw_buffer, &font_parms);
snprintf(strw_buffer, sizeof(strw_buffer), "Rotation: %s", rotation_lut[g_extern.console.screen.orientation]);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_ORIENTATION);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_ORIENTATION);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, strw_buffer, &font_parms);
#ifdef HAVE_FBO
snprintf(strw_buffer, sizeof(strw_buffer), "Scale Factor: %f (X) / %f (Y)",
g_settings.video.fbo.scale_x, g_settings.video.fbo.scale_y);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_SCALE_FACTOR);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_SCALE_FACTOR);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, strw_buffer, &font_parms);
#endif
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_RESIZE_MODE);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_RESIZE_MODE);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, "Resize Mode", &font_parms);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_FRAME_ADVANCE);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_FRAME_ADVANCE);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, "Frame Advance", &font_parms);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_SCREENSHOT_MODE);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_SCREENSHOT_MODE);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, "Screenshot Mode", &font_parms);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_RESET);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_RESET);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, "Reset", &font_parms);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_RETURN_TO_GAME);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_RETURN_TO_GAME);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, "Return To Game", &font_parms);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_RETURN_TO_MENU);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_RETURN_TO_MENU);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, "Change Game", &font_parms);
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_CHANGE_LIBRETRO);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_CHANGE_LIBRETRO);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, "Change libretro core", &font_parms);
#ifdef HAVE_MULTIMAN
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_RETURN_TO_MULTIMAN);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_RETURN_TO_MULTIMAN);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, "Return to multiMAN", &font_parms);
#endif
font_parms.y = default_pos.y_position + (default_pos.y_position_increment * MENU_ITEM_QUIT_RARCH);
font_parms.color = MENU_ITEM_SELECTED(MENU_ITEM_QUIT_RARCH);
if (driver.video_poke->set_osd_msg)
driver.video_poke->set_osd_msg(driver.video_data, "Quit RetroArch", &font_parms);
rarch_position_t position = {0};
position.x = default_pos.x_position;
position.y = (default_pos.y_position+(default_pos.y_position_increment * menu_idx));
device_ptr->ctx_driver->rmenu_draw_panel(&position);
return 0; return 0;
} }

View File

@ -177,7 +177,26 @@ enum
SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R3, SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R3,
SETTING_CONTROLS_SAVE_CUSTOM_CONTROLS, SETTING_CONTROLS_SAVE_CUSTOM_CONTROLS,
SETTING_CONTROLS_DEFAULT_ALL, SETTING_CONTROLS_DEFAULT_ALL,
SETTING_LAST SETTING_LAST,
INGAME_MENU_LOAD_STATE,
INGAME_MENU_SAVE_STATE,
INGAME_MENU_ASPECT_RATIO,
INGAME_MENU_OVERSCAN,
INGAME_MENU_ROTATION,
#ifdef HAVE_FBO
INGAME_MENU_SCALE_FACTOR,
#endif
INGAME_MENU_RESIZE_MODE,
INGAME_MENU_FRAME_ADVANCE,
INGAME_MENU_SCREENSHOT_MODE,
INGAME_MENU_RESET,
INGAME_MENU_RETURN_TO_GAME,
INGAME_MENU_CHANGE_GAME,
INGAME_MENU_CHANGE_LIBRETRO_CORE,
#ifdef HAVE_MULTIMAN
INGAME_MENU_RETURN_TO_MULTIMAN,
#endif
INGAME_MENU_QUIT_RETROARCH,
}; };
#endif #endif
@ -189,6 +208,7 @@ enum
#define FIRST_PATH_SETTING SETTING_EMU_AUDIO_DEFAULT_ALL+1 #define FIRST_PATH_SETTING SETTING_EMU_AUDIO_DEFAULT_ALL+1
#define FIRST_CONTROLS_SETTING_PAGE_1 SETTING_PATH_DEFAULT_ALL+1 #define FIRST_CONTROLS_SETTING_PAGE_1 SETTING_PATH_DEFAULT_ALL+1
#define FIRST_CONTROL_BIND SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_B #define FIRST_CONTROL_BIND SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_B
#define FIRST_INGAME_MENU_SETTING SETTING_LAST+1
#define MAX_NO_OF_VIDEO_SETTINGS SETTING_DEFAULT_VIDEO_ALL+1 #define MAX_NO_OF_VIDEO_SETTINGS SETTING_DEFAULT_VIDEO_ALL+1
#define MAX_NO_OF_AUDIO_SETTINGS SETTING_DEFAULT_AUDIO_ALL+1 #define MAX_NO_OF_AUDIO_SETTINGS SETTING_DEFAULT_AUDIO_ALL+1
@ -197,6 +217,7 @@ enum
#define MAX_NO_OF_EMU_AUDIO_SETTINGS SETTING_EMU_AUDIO_DEFAULT_ALL+1 #define MAX_NO_OF_EMU_AUDIO_SETTINGS SETTING_EMU_AUDIO_DEFAULT_ALL+1
#define MAX_NO_OF_PATH_SETTINGS SETTING_PATH_DEFAULT_ALL+1 #define MAX_NO_OF_PATH_SETTINGS SETTING_PATH_DEFAULT_ALL+1
#define MAX_NO_OF_CONTROLS_SETTINGS SETTING_CONTROLS_DEFAULT_ALL+1 #define MAX_NO_OF_CONTROLS_SETTINGS SETTING_CONTROLS_DEFAULT_ALL+1
#define MAX_NO_OF_INGAME_MENU_SETTINGS INGAME_MENU_QUIT_RETROARCH+1
void menu_init (void); void menu_init (void);
bool menu_iterate(void); bool menu_iterate(void);