/* RetroArch - A frontend for libretro. * Copyright (C) 2010-2012 - Hans-Kristian Arntzen * Copyright (C) 2011-2012 - Daniel De Matteis * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. * * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ #include #include #include #include #if(CELL_SDK_VERSION > 0x340000) #include #endif #include "../ps3_input.h" #include "../../console/fileio/file_browser.h" #include "../../console/rarch_console.h" #include "../../console/rarch_console_rom_ext.h" #include "../../console/rarch_console_input.h" #include "../../console/rarch_console_config.h" #include "../../console/rarch_console_settings.h" #include "../../console/rarch_console_rsound.h" #include "../../console/rarch_console_video.h" #ifdef HAVE_ZLIB #include "../../console/rarch_console_rzlib.h" #endif #include "../../gfx/gl_common.h" #include "../../gfx/gl_font.h" #include "../../gfx/gfx_context.h" #include "../../gfx/context/ps3_ctx.h" #include "../../gfx/shader_cg.h" #include "../../file.h" #include "../../general.h" #include "menu.h" #include "menu-entries.h" #define NUM_ENTRY_PER_PAGE 17 #define INPUT_SCALE 2 #define MENU_ITEM_SELECTED(index) (menuitem_colors[index]) menu menuStack[10]; int menuStackindex = 0; static bool set_libretro_core_as_launch; filebrowser_t browser; filebrowser_t tmpBrowser; unsigned set_shader = 0; static unsigned currently_selected_controller_menu = 0; static char strw_buffer[PATH_MAX]; char core_text[256]; typedef enum { SETTINGS_ACTION_DOWN, SETTINGS_ACTION_UP, SETTINGS_ACTION_TAB_PREVIOUS, SETTINGS_ACTION_TAB_NEXT, SETTINGS_ACTION_NOOP } settings_action_t; typedef enum { MENU_ROMSELECT_ACTION_OK, MENU_ROMSELECT_ACTION_GOTO_SETTINGS, MENU_ROMSELECT_ACTION_NOOP, } menu_romselect_action_t; static void set_setting_label_write_on_or_off(item *items, bool cond, unsigned currentsetting) { if(cond) snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "ON"); else snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "OFF"); } static void set_setting_label_color(item *items, bool cond, unsigned currentsetting) { if(cond) items[currentsetting].text_color = GREEN; else items[currentsetting].text_color = ORANGE; } static void set_setting_label(menu * current_menu, item *items, unsigned currentsetting) { char fname[PATH_MAX]; (void)fname; switch(currentsetting) { case SETTING_CHANGE_RESOLUTION: set_setting_label_color(items,g_console.initial_resolution_id == g_console.supported_resolutions[g_console.current_resolution_index], currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), ps3_get_resolution_label(g_console.supported_resolutions[g_console.current_resolution_index])); break; case SETTING_SHADER_PRESETS: set_setting_label_color(items,true, currentsetting); fill_pathname_base(fname, g_console.cgp_path, sizeof(fname)); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), fname); break; case SETTING_SHADER: fill_pathname_base(fname, g_settings.video.cg_shader_path, sizeof(fname)); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "%s", fname); set_setting_label_color(items,strcmp(g_settings.video.cg_shader_path, default_paths.shader_file) == 0, currentsetting); break; case SETTING_SHADER_2: fill_pathname_base(fname, g_settings.video.second_pass_shader, sizeof(fname)); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "%s", fname); set_setting_label_color(items,strcmp(g_settings.video.second_pass_shader, default_paths.shader_file) == 0, currentsetting); break; case SETTING_FONT_SIZE: set_setting_label_color(items,g_console.menu_font_size == 1.0f, currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "%f", g_console.menu_font_size); break; case SETTING_KEEP_ASPECT_RATIO: set_setting_label_color(items,g_console.aspect_ratio_index == ASPECT_RATIO_4_3, currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), aspectratio_lut[g_console.aspect_ratio_index].name); break; case SETTING_HW_TEXTURE_FILTER: set_setting_label_color(items,g_settings.video.smooth, currentsetting); if(g_settings.video.smooth) snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "Linear interpolation"); else snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "Point filtering"); break; case SETTING_HW_TEXTURE_FILTER_2: set_setting_label_color(items,g_settings.video.second_pass_smooth, currentsetting); if(g_settings.video.second_pass_smooth) snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "Linear interpolation"); else snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "Point filtering"); break; case SETTING_SCALE_ENABLED: set_setting_label_write_on_or_off(items, g_console.fbo_enabled, currentsetting); set_setting_label_color(items,g_console.fbo_enabled, currentsetting); break; case SETTING_SCALE_FACTOR: set_setting_label_color(items,g_settings.video.fbo_scale_x == 2.0f, currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "%fx (X) / %fx (Y)", g_settings.video.fbo_scale_x, g_settings.video.fbo_scale_y); snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [Custom Scaling Factor] is set to: '%fx (X) / %fx (Y)'.", g_settings.video.fbo_scale_x, g_settings.video.fbo_scale_y); break; case SETTING_HW_OVERSCAN_AMOUNT: set_setting_label_color(items,g_console.overscan_amount == 0.0f, currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "%f", g_console.overscan_amount); break; case SETTING_THROTTLE_MODE: set_setting_label_write_on_or_off(items, g_console.throttle_enable, currentsetting); set_setting_label_color(items,g_console.throttle_enable, currentsetting); break; case SETTING_TRIPLE_BUFFERING: set_setting_label_write_on_or_off(items, g_console.triple_buffering_enable, currentsetting); set_setting_label_color(items,g_console.triple_buffering_enable, currentsetting); break; case SETTING_ENABLE_SCREENSHOTS: set_setting_label_write_on_or_off(items, g_console.screenshots_enable, currentsetting); set_setting_label_color(items,g_console.screenshots_enable, currentsetting); break; case SETTING_APPLY_SHADER_PRESET_ON_STARTUP: case SETTING_DEFAULT_VIDEO_ALL: break; case SETTING_SOUND_MODE: switch(g_console.sound_mode) { case SOUND_MODE_NORMAL: snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [Sound Output] is set to 'Normal' - normal audio output will be\nused."); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "Normal"); items[currentsetting].text_color = GREEN; break; case SOUND_MODE_RSOUND: snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [Sound Output] is set to 'RSound' - the sound will be streamed over the\n network to the RSound audio server." ); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "RSound"); items[currentsetting].text_color = ORANGE; break; case SOUND_MODE_HEADSET: snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [Sound Output] is set to 'USB/Bluetooth Headset' - sound will\n be output through the headset"); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "USB/Bluetooth Headset"); items[currentsetting].text_color = ORANGE; break; default: break; } break; case SETTING_RSOUND_SERVER_IP_ADDRESS: set_setting_label_color(items,strcmp(g_settings.audio.device,"0.0.0.0") == 0, currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), g_settings.audio.device); break; case SETTING_DEFAULT_AUDIO_ALL: break; case SETTING_EMU_CURRENT_SAVE_STATE_SLOT: set_setting_label_color(items,g_extern.state_slot == 0, currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "%d", g_extern.state_slot); break; /* emu-specific */ case SETTING_EMU_SHOW_INFO_MSG: set_setting_label_write_on_or_off(items, g_console.info_msg_enable, currentsetting); set_setting_label_color(items,g_console.info_msg_enable, currentsetting); break; case SETTING_EMU_REWIND_ENABLED: set_setting_label_write_on_or_off(items, g_settings.rewind_enable, currentsetting); if(g_settings.rewind_enable) { items[currentsetting].text_color = ORANGE; snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [Rewind] feature is set to 'ON'. You can rewind the game in real-time."); } else { items[currentsetting].text_color = GREEN; snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [Rewind] feature is set to 'OFF'."); } break; case SETTING_ZIP_EXTRACT: set_setting_label_color(items,g_console.zip_extract_mode == ZIP_EXTRACT_TO_CURRENT_DIR, currentsetting); switch(g_console.zip_extract_mode) { case ZIP_EXTRACT_TO_CURRENT_DIR: snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "Current dir"); snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [ZIP Extract Mode] is set to 'Current dir'.\nZIP files are extracted to the current directory."); break; case ZIP_EXTRACT_TO_CURRENT_DIR_AND_LOAD_FIRST_FILE: snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "Current dir and load first file"); snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [ZIP Extract Mode] is set to 'Current dir and load first file'.\nZIP files are extracted to the current directory, and the first game is automatically loaded."); break; case ZIP_EXTRACT_TO_CACHE_DIR: snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "Cache dir"); snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [ZIP Extract Mode] is set to 'Cache dir'.\nZIP files are extracted to the cache directory (dev_hdd1)."); break; } break; case SETTING_RARCH_DEFAULT_EMU: fill_pathname_base(fname, g_settings.libretro, sizeof(fname)); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "%s", fname); items[currentsetting].text_color = GREEN; break; case SETTING_EMU_AUDIO_MUTE: set_setting_label_write_on_or_off(items, g_extern.audio_data.mute, currentsetting); set_setting_label_color(items,!g_extern.audio_data.mute, currentsetting); if(g_extern.audio_data.mute) snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [Audio Mute] feature is set to 'ON'. The game audio will be muted."); else snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [Audio Mute] feature is set to 'OFF'."); break; case SETTING_ENABLE_CUSTOM_BGM: set_setting_label_write_on_or_off(items, g_console.custom_bgm_enable, currentsetting); set_setting_label_color(items,g_console.custom_bgm_enable, currentsetting); break; case SETTING_PATH_DEFAULT_ROM_DIRECTORY: set_setting_label_color(items,!(strcmp(g_console.default_rom_startup_dir, "/")), currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), g_console.default_rom_startup_dir); break; case SETTING_PATH_SAVESTATES_DIRECTORY: set_setting_label_color(items,!(strcmp(g_console.default_savestate_dir, default_paths.port_dir)), currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), g_console.default_savestate_dir); break; case SETTING_PATH_SRAM_DIRECTORY: set_setting_label_color(items,!(strcmp(g_console.default_sram_dir, default_paths.port_dir)), currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), g_console.default_sram_dir); break; case SETTING_PATH_CHEATS: set_setting_label_color(items,!(strcmp(g_settings.cheat_database, default_paths.port_dir)), currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), g_settings.cheat_database); break; case SETTING_PATH_SYSTEM: set_setting_label_color(items,!(strcmp(g_settings.system_directory, default_paths.system_dir)), currentsetting); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), g_settings.system_directory); break; case SETTING_ENABLE_SRAM_PATH: set_setting_label_write_on_or_off(items, g_console.default_sram_dir_enable, currentsetting); set_setting_label_color(items,!g_console.default_sram_dir_enable, currentsetting); break; case SETTING_ENABLE_STATE_PATH: set_setting_label_write_on_or_off(items, g_console.default_savestate_dir_enable, currentsetting); set_setting_label_color(items,!g_console.default_savestate_dir_enable, currentsetting); break; case SETTING_CONTROLS_SCHEME: set_setting_label_color(items,strcmp(g_console.input_cfg_path,"") == 0, currentsetting); snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - Input scheme preset [%s] is selected.", g_console.input_cfg_path); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), g_console.input_cfg_path); break; case SETTING_CONTROLS_NUMBER: set_setting_label_color(items,currently_selected_controller_menu == 0, currentsetting); snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "Controller %d is currently selected.", currently_selected_controller_menu+1); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), "%d", currently_selected_controller_menu+1); 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: { set_setting_label_color(items,g_settings.input.binds[currently_selected_controller_menu][currentsetting-(FIRST_CONTROL_BIND)].joykey == rarch_default_keybind_lut[currentsetting-FIRST_CONTROL_BIND], currentsetting); const char * value = rarch_input_find_platform_key_label(g_settings.input.binds[currently_selected_controller_menu][currentsetting-(FIRST_CONTROL_BIND)].joykey); unsigned id = currentsetting - FIRST_CONTROL_BIND; snprintf(items[currentsetting].text, sizeof(items[currentsetting].text), rarch_input_get_default_keybind_name(id)); snprintf(items[currentsetting].comment, sizeof(items[currentsetting].comment), "INFO - [%s] on the PS3 controller is mapped to action:\n[%s].", items[currentsetting].text, value); snprintf(items[currentsetting].setting_text, sizeof(items[currentsetting].setting_text), value); } break; case SETTING_CONTROLS_SAVE_CUSTOM_CONTROLS: case SETTING_CONTROLS_DEFAULT_ALL: case SETTING_EMU_VIDEO_DEFAULT_ALL: case SETTING_EMU_AUDIO_DEFAULT_ALL: case SETTING_PATH_DEFAULT_ALL: case SETTING_EMU_DEFAULT_ALL: case SETTING_SAVE_SHADER_PRESET: set_setting_label_color(items, current_menu->selected == currentsetting, currentsetting); break; default: break; } } static void menu_stack_decrement(void) { if(menuStackindex > 0) menuStackindex--; } menu *menu_stack_get_current_ptr (void) { menu *current_menu = &menuStack[menuStackindex]; return current_menu; } static void menu_stack_refresh (item *items, menu *current_menu) { int page, i, j; float increment; float increment_step = 0.03f; float x_position = 0.09f; page = 0; j = 0; increment = 0.16f; for(i = current_menu->first_setting; i < current_menu->max_settings; i++) { if(!(j < (NUM_ENTRY_PER_PAGE))) { j = 0; increment = 0.16f; page++; } items[i].text_xpos = x_position; items[i].text_ypos = increment; items[i].page = page; set_setting_label(current_menu, items, i); increment += increment_step; j++; } } static void menu_stack_push(item *items, unsigned menu_id) { static bool first_push_do_not_increment = true; bool do_refresh = true; if(!first_push_do_not_increment) menuStackindex++; else first_push_do_not_increment = false; menu *current_menu = menu_stack_get_current_ptr(); switch(menu_id) { case INGAME_MENU: strlcpy(current_menu->title, "Ingame Menu", sizeof(current_menu->title)); current_menu->enum_id = menu_id; current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_INGAME_MENU; break; case INGAME_MENU_RESIZE: strlcpy(current_menu->title, "Resize Menu", sizeof(current_menu->title)); current_menu->enum_id = INGAME_MENU_RESIZE; current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_INGAME_MENU; break; case INGAME_MENU_SCREENSHOT: strlcpy(current_menu->title, "Ingame Menu", sizeof(current_menu->title)); current_menu->enum_id = menu_id; current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_INGAME_MENU; break; case FILE_BROWSER_MENU: strlcpy(current_menu->title, "File Browser", sizeof(current_menu->title)); current_menu->enum_id = menu_id; current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; break; case LIBRETRO_CHOICE: strlcpy(current_menu->title, "Libretro cores", sizeof(current_menu->title)); current_menu->enum_id = menu_id; current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; break; case PRESET_CHOICE: strlcpy(current_menu->title, "Shader presets", sizeof(current_menu->title)); current_menu->enum_id = menu_id; current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; break; case INPUT_PRESET_CHOICE: strlcpy(current_menu->title, "Input presets", sizeof(current_menu->title)); current_menu->enum_id = menu_id; current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; break; case SHADER_CHOICE: strlcpy(current_menu->title, "Shaders", sizeof(current_menu->title)); current_menu->enum_id = menu_id; current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; break; case BORDER_CHOICE: strlcpy(current_menu->title, "Borders", sizeof(current_menu->title)); current_menu->enum_id = menu_id; current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; break; case PATH_DEFAULT_ROM_DIR_CHOICE: case PATH_SAVESTATES_DIR_CHOICE: case PATH_SRAM_DIR_CHOICE: case PATH_CHEATS_DIR_CHOICE: case PATH_SYSTEM_DIR_CHOICE: strlcpy(current_menu->title, "Path Selection", sizeof(current_menu->title)); current_menu->enum_id = menu_id; current_menu->selected = 0; current_menu->page = 0; current_menu->category_id = CATEGORY_FILEBROWSER; break; case GENERAL_VIDEO_MENU: strlcpy(current_menu->title, "Video", sizeof(current_menu->title)); current_menu->enum_id = GENERAL_VIDEO_MENU; current_menu->selected = FIRST_VIDEO_SETTING; current_menu->page = 0; current_menu->first_setting = FIRST_VIDEO_SETTING; current_menu->max_settings = MAX_NO_OF_VIDEO_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; break; case GENERAL_AUDIO_MENU: strlcpy(current_menu->title, "Audio", sizeof(current_menu->title)); current_menu->enum_id = GENERAL_AUDIO_MENU; current_menu->selected = FIRST_AUDIO_SETTING; current_menu->page = 0; current_menu->first_setting = FIRST_AUDIO_SETTING; current_menu->max_settings = MAX_NO_OF_AUDIO_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; break; case EMU_GENERAL_MENU: strlcpy(current_menu->title, "Retro", sizeof(current_menu->title)); current_menu->enum_id = EMU_GENERAL_MENU; current_menu->selected = FIRST_EMU_SETTING; current_menu->page = 0; current_menu->first_setting = FIRST_EMU_SETTING; current_menu->max_settings = MAX_NO_OF_EMU_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; break; case EMU_VIDEO_MENU: strlcpy(current_menu->title, "Retro Video", sizeof(current_menu->title)); current_menu->enum_id = EMU_VIDEO_MENU; current_menu->selected = FIRST_EMU_VIDEO_SETTING; current_menu->page = 0; current_menu->first_setting = FIRST_EMU_VIDEO_SETTING; current_menu->max_settings = MAX_NO_OF_EMU_VIDEO_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; break; case EMU_AUDIO_MENU: strlcpy(current_menu->title, "Retro Audio", sizeof(current_menu->title)); current_menu->enum_id = EMU_AUDIO_MENU; current_menu->selected = FIRST_EMU_AUDIO_SETTING; current_menu->page = 0; current_menu->first_setting = FIRST_EMU_AUDIO_SETTING; current_menu->max_settings = MAX_NO_OF_EMU_AUDIO_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; break; case PATH_MENU: strlcpy(current_menu->title, "Path", sizeof(current_menu->title)); current_menu->enum_id = PATH_MENU; current_menu->selected = FIRST_PATH_SETTING; current_menu->page = 0; current_menu->first_setting = FIRST_PATH_SETTING; current_menu->max_settings = MAX_NO_OF_PATH_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; break; case CONTROLS_MENU: strlcpy(current_menu->title, "Controls", sizeof(current_menu->title)); current_menu->enum_id = CONTROLS_MENU; current_menu->selected = FIRST_CONTROLS_SETTING_PAGE_1; current_menu->page = 0; current_menu->first_setting = FIRST_CONTROLS_SETTING_PAGE_1; current_menu->max_settings = MAX_NO_OF_CONTROLS_SETTINGS; current_menu->category_id = CATEGORY_SETTINGS; break; default: do_refresh = false; break; } if(do_refresh) menu_stack_refresh(items, current_menu); } //forward decls extern const char *ps3_get_resolution_label(unsigned resolution); static void display_menubar(menu *current_menu) { DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; filebrowser_t *fb = &browser; char current_path[256], rarch_version[128]; float x_position = 0.09f; float font_size = 0.91f; snprintf(rarch_version, sizeof(rarch_version), "v%s", PACKAGE_VERSION); switch(current_menu->enum_id) { case GENERAL_VIDEO_MENU: render_msg_place_func(x_position, 0.03f, font_size, WHITE, "NEXT ->"); break; case GENERAL_AUDIO_MENU: case EMU_GENERAL_MENU: case EMU_VIDEO_MENU: case EMU_AUDIO_MENU: case PATH_MENU: render_msg_place_func(x_position, 0.03f, font_size, WHITE, "<- PREV | NEXT ->"); break; case CONTROLS_MENU: case INGAME_MENU_RESIZE: case SHADER_CHOICE: case PRESET_CHOICE: case BORDER_CHOICE: case LIBRETRO_CHOICE: case INPUT_PRESET_CHOICE: case PATH_SAVESTATES_DIR_CHOICE: case PATH_DEFAULT_ROM_DIR_CHOICE: case PATH_CHEATS_DIR_CHOICE: case PATH_SRAM_DIR_CHOICE: render_msg_place_func(x_position, 0.03f, font_size, WHITE, "<- PREV"); break; default: break; } switch(current_menu->enum_id) { case SHADER_CHOICE: case PRESET_CHOICE: case BORDER_CHOICE: case LIBRETRO_CHOICE: case INPUT_PRESET_CHOICE: case PATH_SAVESTATES_DIR_CHOICE: case PATH_DEFAULT_ROM_DIR_CHOICE: case PATH_CHEATS_DIR_CHOICE: case PATH_SRAM_DIR_CHOICE: fb = &tmpBrowser; case FILE_BROWSER_MENU: snprintf(current_path, sizeof(current_path), "PATH: %s", filebrowser_get_current_dir(fb)); render_msg_place_func(x_position, 0.09f, FONT_SIZE, YELLOW, current_path); break; default: break; } render_msg_place_func(x_position, 0.05f, 1.4f, WHITE, current_menu->title); render_msg_place_func(0.3f, 0.06f, 0.82f, WHITE, core_text); render_msg_place_func(0.8f, 0.12f, 0.82f, WHITE, rarch_version); render_msg_post_func(); } static uint64_t old_state = 0; static void browser_update(filebrowser_t * b, uint64_t input, const char *extensions) { filebrowser_action_t action = FILEBROWSER_ACTION_NOOP; if (input & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) action = FILEBROWSER_ACTION_DOWN; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_UP)) action = FILEBROWSER_ACTION_UP; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) action = FILEBROWSER_ACTION_RIGHT; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) action = FILEBROWSER_ACTION_LEFT; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_R)) action = FILEBROWSER_ACTION_SCROLL_DOWN; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_R2)) action = FILEBROWSER_ACTION_SCROLL_DOWN_SMOOTH; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_L2)) action = FILEBROWSER_ACTION_SCROLL_UP_SMOOTH; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_L)) action = FILEBROWSER_ACTION_SCROLL_UP; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_A)) action = FILEBROWSER_ACTION_CANCEL; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { action = FILEBROWSER_ACTION_RESET; filebrowser_set_root(b, "/"); strlcpy(b->extensions, extensions, sizeof(b->extensions)); } if(action != FILEBROWSER_ACTION_NOOP) filebrowser_iterate(b, action); } static void browser_render(filebrowser_t * b, float current_x, float current_y, float y_spacing) { DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; unsigned file_count = b->current_dir.list->size; int current_index, page_number, page_base, i; float currentX, currentY, ySpacing; current_index = b->current_dir.ptr; page_number = current_index / NUM_ENTRY_PER_PAGE; page_base = page_number * NUM_ENTRY_PER_PAGE; currentX = current_x; currentY = current_y; ySpacing = y_spacing; for ( i = page_base; i < file_count && i < page_base + NUM_ENTRY_PER_PAGE; ++i) { char fname_tmp[256]; fill_pathname_base(fname_tmp, b->current_dir.list->elems[i].data, sizeof(fname_tmp)); currentY = currentY + ySpacing; render_msg_place_func(currentX, currentY, FONT_SIZE, i == current_index ? RED : b->current_dir.list->elems[i].attr.b ? GREEN : WHITE, fname_tmp); render_msg_post_func(); } render_msg_post_func(); } static void apply_scaling (unsigned init_mode) { DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; switch(init_mode) { case FBO_DEINIT: gl_deinit_fbo(device_ptr); break; case FBO_INIT: gl_init_fbo(device_ptr, RARCH_SCALE_BASE * INPUT_SCALE, RARCH_SCALE_BASE * INPUT_SCALE); break; case FBO_REINIT: gl_deinit_fbo(device_ptr); gl_init_fbo(device_ptr, RARCH_SCALE_BASE * INPUT_SCALE, RARCH_SCALE_BASE * INPUT_SCALE); break; } } static void select_file(item *items, menu *current_menu, uint64_t input) { char extensions[256], object[256], comment[256], comment_two[256], path[PATH_MAX]; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; float x_position = 0.09f; float comment_y_position = 0.83f; float comment_two_y_position = 0.91f; float font_size = 0.91f; switch(current_menu->enum_id) { case SHADER_CHOICE: strlcpy(extensions, EXT_SHADERS, sizeof(extensions)); strlcpy(object, "Shader", sizeof(object)); strlcpy(comment, "INFO - Select a shader from the menu by pressing the X button.", sizeof(comment)); break; case PRESET_CHOICE: strlcpy(extensions, EXT_CGP_PRESETS, sizeof(extensions)); strlcpy(object, "Shader preset", sizeof(object)); strlcpy(comment, "INFO - Select a shader preset from the menu by pressing the X button.", sizeof(comment)); break; case INPUT_PRESET_CHOICE: strlcpy(extensions, EXT_INPUT_PRESETS, sizeof(extensions)); strlcpy(object, "Input preset", sizeof(object)); strlcpy(comment, "INFO - Select an input preset from the menu by pressing the X button.", sizeof(comment)); break; case BORDER_CHOICE: strlcpy(extensions, EXT_IMAGES, sizeof(extensions)); strlcpy(object, "Border image file", sizeof(object)); strlcpy(comment, "INFO - Select a border image file from the menu by pressing the X button.", sizeof(comment)); break; case LIBRETRO_CHOICE: strlcpy(extensions, EXT_EXECUTABLES, sizeof(extensions)); strlcpy(object, "Libretro core", sizeof(object)); strlcpy(comment, "INFO - Select a Libretro core from the menu by pressing the X button.", sizeof(comment)); break; } browser_update(&tmpBrowser, input, extensions); if (input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) { bool is_dir = filebrowser_get_current_path_isdir(&tmpBrowser); if(is_dir) filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_OK); else { snprintf(path, sizeof(path), filebrowser_get_current_path(&tmpBrowser)); switch(current_menu->enum_id) { case SHADER_CHOICE: rarch_load_shader(set_shader+1, path); switch(set_shader+1) { case 1: strlcpy(g_settings.video.cg_shader_path, path, sizeof(g_settings.video.cg_shader_path)); break; case 2: strlcpy(g_settings.video.second_pass_shader, path, sizeof(g_settings.video.second_pass_shader)); break; } menu_stack_refresh(items, current_menu); break; case PRESET_CHOICE: strlcpy(g_console.cgp_path, path, sizeof(g_console.cgp_path)); apply_scaling(FBO_DEINIT); gl_cg_reinit(path); apply_scaling(FBO_INIT); break; case INPUT_PRESET_CHOICE: strlcpy(g_console.input_cfg_path, path, sizeof(g_console.input_cfg_path)); config_read_keybinds(path); menu_stack_refresh(items, current_menu); break; case BORDER_CHOICE: break; case LIBRETRO_CHOICE: strlcpy(g_settings.libretro, path, sizeof(g_settings.libretro)); if(set_libretro_core_as_launch) { strlcpy(g_console.launch_app_on_exit, path, sizeof(g_console.launch_app_on_exit)); set_libretro_core_as_launch = false; rarch_settings_change(S_RETURN_TO_LAUNCHER); } break; } menu_stack_decrement(); } } else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_X)) menu_stack_decrement(); display_menubar(current_menu); snprintf(comment_two, sizeof(comment_two), "X - Select %s /\\ - return to settings START - Reset Startdir", object); render_msg_place_func(x_position, comment_two_y_position, font_size, YELLOW, comment_two); render_msg_place_func(x_position, comment_y_position, font_size, LIGHTBLUE, comment); render_msg_post_func(); } static void select_directory(item *items, menu *current_menu, uint64_t input) { char path[1024]; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; float x_position = 0.09f; float comment_y_position = 0.83f; float font_size = 0.91f; bool is_dir = filebrowser_get_current_path_isdir(&tmpBrowser); browser_update(&tmpBrowser, input, "empty"); if (input & (1 << RETRO_DEVICE_ID_JOYPAD_Y)) { if(is_dir) { snprintf(path, sizeof(path), filebrowser_get_current_path(&tmpBrowser)); switch(current_menu->enum_id) { case PATH_SAVESTATES_DIR_CHOICE: strlcpy(g_console.default_savestate_dir, path, sizeof(g_console.default_savestate_dir)); break; case PATH_SRAM_DIR_CHOICE: strlcpy(g_console.default_sram_dir, path, sizeof(g_console.default_sram_dir)); break; case PATH_DEFAULT_ROM_DIR_CHOICE: strlcpy(g_console.default_rom_startup_dir, path, sizeof(g_console.default_rom_startup_dir)); break; case PATH_CHEATS_DIR_CHOICE: strlcpy(g_settings.cheat_database, path, sizeof(g_settings.cheat_database)); break; } menu_stack_decrement(); } } else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_X)) { strlcpy(path, default_paths.port_dir, sizeof(path)); switch(current_menu->enum_id) { case PATH_SAVESTATES_DIR_CHOICE: strlcpy(g_console.default_savestate_dir, path, sizeof(g_console.default_savestate_dir)); break; case PATH_SRAM_DIR_CHOICE: strlcpy(g_console.default_sram_dir, path, sizeof(g_console.default_sram_dir)); break; case PATH_DEFAULT_ROM_DIR_CHOICE: strlcpy(g_console.default_rom_startup_dir, path, sizeof(g_console.default_rom_startup_dir)); break; case PATH_CHEATS_DIR_CHOICE: strlcpy(g_settings.cheat_database, path, sizeof(g_settings.cheat_database)); break; } menu_stack_decrement(); } else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) { if(is_dir) filebrowser_iterate(&tmpBrowser, FILEBROWSER_ACTION_OK); } display_menubar(current_menu); render_msg_place_func(x_position, 0.93f, font_size, YELLOW, "X - Enter dir /\\ - return to settings START - Reset Startdir"); render_msg_place_func(x_position, comment_y_position, font_size, LIGHTBLUE, "INFO - Browse to a directory and assign it as the path by\npressing SQUARE button."); render_msg_post_func(); } static void set_keybind_digital(uint64_t default_retro_joypad_id, uint64_t input) { unsigned keybind_action = KEYBIND_NOACTION; if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) keybind_action = KEYBIND_DECREMENT; if((input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) keybind_action = KEYBIND_INCREMENT; if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) keybind_action = KEYBIND_DEFAULT; rarch_input_set_keybind(currently_selected_controller_menu, keybind_action, default_retro_joypad_id); } static void rarch_filename_input_and_save (unsigned filename_type) { bool filename_entered = false; char filename_tmp[256], filepath[PATH_MAX]; oskutil_write_initial_message(&g_console.oskutil_handle, L"example"); oskutil_write_message(&g_console.oskutil_handle, L"Enter filename for preset (with no file extension)"); oskutil_start(&g_console.oskutil_handle); while(OSK_IS_RUNNING(g_console.oskutil_handle)) { gfx_ctx_clear(); gfx_ctx_swap_buffers(); #ifdef HAVE_SYSUTILS cellSysutilCheckCallback(); #endif } if(g_console.oskutil_handle.text_can_be_fetched) { strlcpy(filename_tmp, OUTPUT_TEXT_STRING(g_console.oskutil_handle), sizeof(filename_tmp)); switch(filename_type) { case CONFIG_FILE: break; case SHADER_PRESET_FILE: snprintf(filepath, sizeof(filepath), "%s/%s.cgp", default_paths.cgp_dir, filename_tmp); break; case INPUT_PRESET_FILE: snprintf(filepath, sizeof(filepath), "%s/%s.cfg", default_paths.input_presets_dir, filename_tmp); break; } filename_entered = true; } if(filename_entered) { char filetitle_tmp[256]; oskutil_write_initial_message(&g_console.oskutil_handle, L"Example file title"); oskutil_write_message(&g_console.oskutil_handle, L"Enter title for preset"); oskutil_start(&g_console.oskutil_handle); while(OSK_IS_RUNNING(g_console.oskutil_handle)) { /* OSK Util gets updated */ gfx_ctx_clear(); gfx_ctx_swap_buffers(); #ifdef HAVE_SYSUTILS cellSysutilCheckCallback(); #endif } if(g_console.oskutil_handle.text_can_be_fetched) snprintf(filetitle_tmp, sizeof(filetitle_tmp), "%s", OUTPUT_TEXT_STRING(g_console.oskutil_handle)); else snprintf(filetitle_tmp, sizeof(filetitle_tmp), "%s", "Custom"); switch(filename_type) { case CONFIG_FILE: break; case SHADER_PRESET_FILE: { struct gl_cg_cgp_info current_settings; current_settings.shader[0] = g_settings.video.cg_shader_path; current_settings.shader[1] = g_settings.video.second_pass_shader; current_settings.filter_linear[0] = g_settings.video.smooth; current_settings.filter_linear[1] = g_settings.video.second_pass_smooth; current_settings.render_to_texture = true; current_settings.fbo_scale = g_settings.video.fbo_scale_x; //fbo_scale_x and y are the same anyway gl_cg_save_cgp(filepath, ¤t_settings); } break; case INPUT_PRESET_FILE: config_save_keybinds(filepath); break; } } } static void producesettingentry(menu *current_menu, item *items, unsigned switchvalue, uint64_t input) { switch(switchvalue) { case SETTING_CHANGE_RESOLUTION: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) rarch_settings_change(S_RESOLUTION_NEXT); if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) rarch_settings_change(S_RESOLUTION_PREVIOUS); if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) { if (g_console.supported_resolutions[g_console.current_resolution_index] == CELL_VIDEO_OUT_RESOLUTION_576) { if(gfx_ctx_check_resolution(CELL_VIDEO_OUT_RESOLUTION_576)) { //ps3graphics_set_pal60hz(Settings.PS3PALTemporalMode60Hz); video_gl.restart(); } } else { //ps3graphics_set_pal60hz(0); video_gl.restart(); } } break; /* case SETTING_PAL60_MODE: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { if (Graphics->GetCurrentResolution() == CELL_VIDEO_OUT_RESOLUTION_576) { if(Graphics->CheckResolution(CELL_VIDEO_OUT_RESOLUTION_576)) { Settings.PS3PALTemporalMode60Hz = !Settings.PS3PALTemporalMode60Hz; Graphics->SetPAL60Hz(Settings.PS3PALTemporalMode60Hz); Graphics->SwitchResolution(Graphics->GetCurrentResolution(), Settings.PS3PALTemporalMode60Hz, Settings.TripleBuffering); } } } break; */ case SETTING_SHADER_PRESETS: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { if(g_console.emulator_initialized) { menu_stack_push(items, PRESET_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, EXT_CGP_PRESETS, default_paths.cgp_dir); } } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) strlcpy(g_console.cgp_path, "", sizeof(g_console.cgp_path)); break; case SETTING_SHADER: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { menu_stack_push(items, SHADER_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, EXT_SHADERS, default_paths.shader_dir); set_shader = 0; } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { rarch_load_shader(1, NULL); strlcpy(g_settings.video.cg_shader_path, default_paths.shader_file, sizeof(g_settings.video.cg_shader_path)); menu_stack_refresh(items, current_menu); } break; case SETTING_SHADER_2: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { menu_stack_push( items, SHADER_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, EXT_SHADERS, default_paths.shader_dir); set_shader = 1; } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { rarch_load_shader(2, NULL); strlcpy(g_settings.video.second_pass_shader, default_paths.shader_file, sizeof(g_settings.video.second_pass_shader)); menu_stack_refresh(items, current_menu); } break; case SETTING_FONT_SIZE: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) { if(g_console.menu_font_size > 0) g_console.menu_font_size -= 0.01f; } if((input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { if((g_console.menu_font_size < 2.0f)) g_console.menu_font_size += 0.01f; } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) g_console.menu_font_size = 1.0f; break; case SETTING_KEEP_ASPECT_RATIO: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) { rarch_settings_change(S_ASPECT_RATIO_DECREMENT); gfx_ctx_set_aspect_ratio(NULL, g_console.aspect_ratio_index); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) { rarch_settings_change(S_ASPECT_RATIO_INCREMENT); gfx_ctx_set_aspect_ratio(NULL, g_console.aspect_ratio_index); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { rarch_settings_default(S_DEF_ASPECT_RATIO); gfx_ctx_set_aspect_ratio(NULL, g_console.aspect_ratio_index); } break; case SETTING_HW_TEXTURE_FILTER: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { rarch_settings_change(S_HW_TEXTURE_FILTER); gfx_ctx_set_filtering(1, g_settings.video.smooth); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { rarch_settings_change(S_DEF_HW_TEXTURE_FILTER); gfx_ctx_set_filtering(1, g_settings.video.smooth); } break; case SETTING_HW_TEXTURE_FILTER_2: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { rarch_settings_change(S_HW_TEXTURE_FILTER_2); gfx_ctx_set_filtering(2, g_settings.video.second_pass_smooth); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { rarch_settings_change(S_DEF_HW_TEXTURE_FILTER_2); gfx_ctx_set_filtering(2, g_settings.video.second_pass_smooth); } break; case SETTING_SCALE_ENABLED: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { rarch_settings_change(S_SCALE_ENABLED); gfx_ctx_set_fbo(g_console.fbo_enabled); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { rarch_settings_default(S_DEF_SCALE_ENABLED); apply_scaling(FBO_DEINIT); apply_scaling(FBO_INIT); } break; case SETTING_SCALE_FACTOR: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) { if(g_console.fbo_enabled) { bool should_decrement = g_settings.video.fbo_scale_x > MIN_SCALING_FACTOR; if(should_decrement) { rarch_settings_change(S_SCALE_FACTOR_DECREMENT); apply_scaling(FBO_REINIT); } } } if((input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { if(g_console.fbo_enabled) { bool should_increment = g_settings.video.fbo_scale_x < MAX_SCALING_FACTOR; if(should_increment) { rarch_settings_change(S_SCALE_FACTOR_INCREMENT); apply_scaling(FBO_REINIT); } } } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { rarch_settings_default(S_DEF_SCALE_FACTOR); apply_scaling(FBO_DEINIT); apply_scaling(FBO_INIT); } break; case SETTING_HW_OVERSCAN_AMOUNT: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) { rarch_settings_change(S_OVERSCAN_DECREMENT); gfx_ctx_set_overscan(); } if((input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { rarch_settings_change(S_OVERSCAN_INCREMENT); gfx_ctx_set_overscan(); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { rarch_settings_default(S_DEF_OVERSCAN); gfx_ctx_set_overscan(); } break; case SETTING_THROTTLE_MODE: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { rarch_settings_change(S_THROTTLE); gfx_ctx_set_swap_interval(g_console.throttle_enable, true); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { rarch_settings_default(S_DEF_THROTTLE); gfx_ctx_set_swap_interval(g_console.throttle_enable, true); } break; case SETTING_TRIPLE_BUFFERING: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { rarch_settings_change(S_TRIPLE_BUFFERING); video_gl.restart(); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { bool old_buffer_input = g_console.triple_buffering_enable; rarch_settings_default(S_DEF_TRIPLE_BUFFERING); if(!old_buffer_input) video_gl.restart(); } break; case SETTING_ENABLE_SCREENSHOTS: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { #if(CELL_SDK_VERSION > 0x340000) g_console.screenshots_enable = !g_console.screenshots_enable; if(g_console.screenshots_enable) { cellSysmoduleLoadModule(CELL_SYSMODULE_SYSUTIL_SCREENSHOT); CellScreenShotSetParam screenshot_param = {0, 0, 0, 0}; screenshot_param.photo_title = "RetroArch PS3"; screenshot_param.game_title = "RetroArch PS3"; cellScreenShotSetParameter (&screenshot_param); cellScreenShotEnable(); } else { cellScreenShotDisable(); cellSysmoduleUnloadModule(CELL_SYSMODULE_SYSUTIL_SCREENSHOT); } #endif } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { #if(CELL_SDK_VERSION > 0x340000) g_console.screenshots_enable = true; #endif } break; case SETTING_SAVE_SHADER_PRESET: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) rarch_filename_input_and_save(SHADER_PRESET_FILE); break; case SETTING_APPLY_SHADER_PRESET_ON_STARTUP: break; case SETTING_DEFAULT_VIDEO_ALL: break; case SETTING_SOUND_MODE: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) { if(g_console.sound_mode != SOUND_MODE_NORMAL) g_console.sound_mode--; } if((input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { if(g_console.sound_mode < SOUND_MODE_HEADSET) g_console.sound_mode++; } if((input & (1 << RETRO_DEVICE_ID_JOYPAD_UP)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN))) { if(g_console.sound_mode != SOUND_MODE_RSOUND) rarch_console_rsound_stop(); else rarch_console_rsound_start(g_settings.audio.device); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { g_console.sound_mode = SOUND_MODE_NORMAL; rarch_console_rsound_stop(); } break; case SETTING_RSOUND_SERVER_IP_ADDRESS: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { oskutil_write_initial_message(&g_console.oskutil_handle, L"192.168.1.1"); oskutil_write_message(&g_console.oskutil_handle, L"Enter IP address for the RSound Server."); oskutil_start(&g_console.oskutil_handle); while(OSK_IS_RUNNING(g_console.oskutil_handle)) { gfx_ctx_clear(); gfx_ctx_swap_buffers(); #ifdef HAVE_SYSUTILS cellSysutilCheckCallback(); #endif } if(g_console.oskutil_handle.text_can_be_fetched) strlcpy(g_settings.audio.device, OUTPUT_TEXT_STRING(g_console.oskutil_handle), sizeof(g_settings.audio.device)); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) strlcpy(g_settings.audio.device, "0.0.0.0", sizeof(g_settings.audio.device)); break; case SETTING_DEFAULT_AUDIO_ALL: break; case SETTING_EMU_CURRENT_SAVE_STATE_SLOT: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) rarch_settings_change(S_SAVESTATE_DECREMENT); if((input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) rarch_settings_change(S_SAVESTATE_INCREMENT); if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) rarch_settings_default(S_DEF_SAVE_STATE); break; case SETTING_EMU_SHOW_INFO_MSG: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) g_console.info_msg_enable = !g_console.info_msg_enable; if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) g_console.info_msg_enable = true; break; case SETTING_EMU_REWIND_ENABLED: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { rarch_settings_change(S_REWIND); if(g_console.info_msg_enable) rarch_settings_msg(S_MSG_RESTART_RARCH, S_DELAY_180); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) g_settings.rewind_enable = false; break; case SETTING_ZIP_EXTRACT: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT))) { if(g_console.zip_extract_mode > 0) g_console.zip_extract_mode--; } if((input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { if(g_console.zip_extract_mode < ZIP_EXTRACT_TO_CACHE_DIR) g_console.zip_extract_mode++; } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { g_console.zip_extract_mode = ZIP_EXTRACT_TO_CURRENT_DIR; } break; case SETTING_RARCH_DEFAULT_EMU: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { menu_stack_push(items, LIBRETRO_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, EXT_EXECUTABLES, default_paths.core_dir); set_libretro_core_as_launch = false; } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { } break; case SETTING_EMU_AUDIO_MUTE: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) rarch_settings_change(S_AUDIO_MUTE); if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) rarch_settings_default(S_DEF_AUDIO_MUTE); break; case SETTING_ENABLE_CUSTOM_BGM: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { #if(CELL_SDK_VERSION > 0x340000) g_console.custom_bgm_enable = !g_console.custom_bgm_enable; if(g_console.custom_bgm_enable) cellSysutilEnableBgmPlayback(); else cellSysutilDisableBgmPlayback(); #endif } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { #if(CELL_SDK_VERSION > 0x340000) g_console.custom_bgm_enable = true; #endif } break; case SETTING_EMU_VIDEO_DEFAULT_ALL: break; case SETTING_EMU_AUDIO_DEFAULT_ALL: break; case SETTING_PATH_DEFAULT_ROM_DIRECTORY: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { menu_stack_push(items, PATH_DEFAULT_ROM_DIR_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, "empty", "/"); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) strlcpy(g_console.default_rom_startup_dir, "/", sizeof(g_console.default_rom_startup_dir)); break; case SETTING_PATH_SAVESTATES_DIRECTORY: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { menu_stack_push(items, PATH_SAVESTATES_DIR_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, "empty", "/"); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) strlcpy(g_console.default_savestate_dir, default_paths.savestate_dir, sizeof(g_console.default_savestate_dir)); break; case SETTING_PATH_SRAM_DIRECTORY: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { menu_stack_push(items, PATH_SRAM_DIR_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, "empty", "/"); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) strlcpy(g_console.default_sram_dir, default_paths.sram_dir, sizeof(g_console.default_sram_dir)); break; case SETTING_PATH_CHEATS: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { menu_stack_push(items, PATH_CHEATS_DIR_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, "empty", "/"); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) strlcpy(g_settings.cheat_database, default_paths.port_dir, sizeof(g_settings.cheat_database)); break; case SETTING_PATH_SYSTEM: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { menu_stack_push(items, PATH_SYSTEM_DIR_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, "empty", "/"); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) strlcpy(g_settings.system_directory, default_paths.system_dir, sizeof(g_settings.system_directory)); break; case SETTING_ENABLE_SRAM_PATH: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT))) { g_console.default_sram_dir_enable = !g_console.default_sram_dir_enable; menu_stack_refresh(items, current_menu); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { g_console.default_sram_dir_enable = true; menu_stack_refresh(items, current_menu); } break; case SETTING_ENABLE_STATE_PATH: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT))) { g_console.default_savestate_dir_enable = !g_console.default_savestate_dir_enable; menu_stack_refresh(items, current_menu); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { g_console.default_savestate_dir_enable = true; menu_stack_refresh(items, current_menu); } break; case SETTING_PATH_DEFAULT_ALL: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_START))) { strlcpy(g_console.default_rom_startup_dir, "/", sizeof(g_console.default_rom_startup_dir)); strlcpy(g_console.default_savestate_dir, default_paths.port_dir, sizeof(g_console.default_savestate_dir)); strlcpy(g_settings.cheat_database, default_paths.port_dir, sizeof(g_settings.cheat_database)); strlcpy(g_console.default_sram_dir, "", sizeof(g_console.default_sram_dir)); menu_stack_refresh(items, current_menu); } break; case SETTING_CONTROLS_SCHEME: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_START))) { menu_stack_push(items, INPUT_PRESET_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, EXT_INPUT_PRESETS, default_paths.input_presets_dir); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) menu_stack_refresh(items, current_menu); break; case SETTING_CONTROLS_NUMBER: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) { if(currently_selected_controller_menu != 0) currently_selected_controller_menu--; menu_stack_refresh(items, current_menu); } if((input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { if(currently_selected_controller_menu < 6) currently_selected_controller_menu++; menu_stack_refresh(items, current_menu); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) currently_selected_controller_menu = 0; break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_UP: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_UP, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_DOWN: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_DOWN, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_LEFT: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_LEFT, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_RIGHT: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_RIGHT, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_A: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_A, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_B: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_B, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_X: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_X, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_Y: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_Y, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_SELECT: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_SELECT, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_START: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_START, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_L: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_L, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_R, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_L2: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_L2, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R2: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_R2, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_L3: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_L3, input); break; case SETTING_CONTROLS_RETRO_DEVICE_ID_JOYPAD_R3: set_keybind_digital(RETRO_DEVICE_ID_JOYPAD_R3, input); break; case SETTING_CONTROLS_SAVE_CUSTOM_CONTROLS: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_START))) rarch_filename_input_and_save(INPUT_PRESET_FILE); break; case SETTING_CONTROLS_DEFAULT_ALL: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_START))) { rarch_input_set_default_keybinds(currently_selected_controller_menu); menu_stack_refresh(items, current_menu); } break; } set_setting_label(current_menu, items, switchvalue); } static void settings_iterate(menu *current_menu, item *items, settings_action_t action) { switch(action) { case SETTINGS_ACTION_DOWN: current_menu->selected++; if (current_menu->selected >= current_menu->max_settings) current_menu->selected = current_menu->first_setting; if (items[current_menu->selected].page != current_menu->page) current_menu->page = items[current_menu->selected].page; break; case SETTINGS_ACTION_UP: if (current_menu->selected == current_menu->first_setting) current_menu->selected = current_menu->max_settings-1; else current_menu->selected--; if (items[current_menu->selected].page != current_menu->page) current_menu->page = items[current_menu->selected].page; break; case SETTINGS_ACTION_TAB_PREVIOUS: menu_stack_decrement(); break; case SETTINGS_ACTION_TAB_NEXT: switch(current_menu->enum_id) { case GENERAL_VIDEO_MENU: case GENERAL_AUDIO_MENU: case EMU_GENERAL_MENU: case EMU_VIDEO_MENU: case EMU_AUDIO_MENU: case PATH_MENU: menu_stack_push(items, current_menu->enum_id + 1); break; case CONTROLS_MENU: default: break; } break; default: break; } } static void select_setting(item *items, menu *current_menu, uint64_t input) { unsigned i; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; float x_position = 0.09f; float comment_y_position = 0.83f; float comment_two_y_position = 0.91f; settings_action_t action = SETTINGS_ACTION_NOOP; /* back to ROM menu if CIRCLE is pressed */ if ((input & (1 << RETRO_DEVICE_ID_JOYPAD_L)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_A))) action = SETTINGS_ACTION_TAB_PREVIOUS; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_R)) action = SETTINGS_ACTION_TAB_NEXT; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) action = SETTINGS_ACTION_DOWN; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_UP)) action = SETTINGS_ACTION_UP; if(action != SETTINGS_ACTION_NOOP) settings_iterate(current_menu, items, action); producesettingentry(current_menu, items, current_menu->selected, input); display_menubar(current_menu); render_msg_post_func(); for(i = current_menu->first_setting; i < current_menu->max_settings; i++) { if(items[i].page == current_menu->page) { render_msg_place_func(items[i].text_xpos, items[i].text_ypos, FONT_SIZE, current_menu->selected == items[i].enum_id ? YELLOW : items[i].item_color, items[i].text); render_msg_place_func(0.5f, items[i].text_ypos, FONT_SIZE, items[i].text_color, items[i].setting_text); render_msg_post_func(); } } render_msg_place_func(x_position, comment_y_position, 0.86f, LIGHTBLUE, items[current_menu->selected].comment); render_msg_place_func(x_position, comment_two_y_position, FONT_SIZE, YELLOW, "UP/DOWN - select L3+R3 - resume game X/LEFT/RIGHT - change"); render_msg_place_func(x_position, 0.95f, FONT_SIZE, YELLOW, "START - default L1/CIRCLE - go back R1 - go forward"); render_msg_post_func(); } static void menu_romselect_iterate(filebrowser_t *filebrowser, item *items, menu_romselect_action_t action) { switch(action) { case MENU_ROMSELECT_ACTION_OK: if(filebrowser_get_current_path_isdir(filebrowser)) filebrowser_iterate(filebrowser, FILEBROWSER_ACTION_OK); else rarch_console_load_game_wrap(filebrowser_get_current_path(filebrowser), g_console.zip_extract_mode, S_DELAY_45); break; case MENU_ROMSELECT_ACTION_GOTO_SETTINGS: menu_stack_push(items, GENERAL_VIDEO_MENU); break; default: break; } } static void select_rom(item *items, menu *current_menu, uint64_t input) { DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; float x_position = 0.09f; float comment_y_position = 0.83f; float font_size = 0.91f; browser_update(&browser, input, rarch_console_get_rom_ext()); menu_romselect_action_t action = MENU_ROMSELECT_ACTION_NOOP; if (input & (1 << RETRO_DEVICE_ID_JOYPAD_SELECT)) action = MENU_ROMSELECT_ACTION_GOTO_SETTINGS; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) action = MENU_ROMSELECT_ACTION_OK; if (action != MENU_ROMSELECT_ACTION_NOOP) menu_romselect_iterate(&browser, items, action); bool is_dir = filebrowser_get_current_path_isdir(&browser); if (is_dir) { const char *current_path = filebrowser_get_current_path(&browser); render_msg_place_func(x_position, comment_y_position, font_size, LIGHTBLUE, "INFO - Press X to enter the directory."); } else render_msg_place_func(x_position, comment_y_position, font_size, LIGHTBLUE, "INFO - Press X to load the game. "); display_menubar(current_menu); render_msg_place_func (x_position, font_size, FONT_SIZE, YELLOW, "L3 + R3 - resume game SELECT - Settings screen"); render_msg_post_func(); } static void ingame_menu_resize(item *items, menu *current_menu, uint64_t input) { (void)items; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; float x_position = 0.09f; float font_size = 0.91f; float y_position = 0.16f; float y_position_increment = 0.035f; float comment_y_position = 0.83f; g_console.aspect_ratio_index = ASPECT_RATIO_CUSTOM; gfx_ctx_set_aspect_ratio(NULL, g_console.aspect_ratio_index); if(input & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_LEFT)) g_console.viewports.custom_vp.x -= 4; else if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) g_console.viewports.custom_vp.x -= 1; if(input & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_RIGHT)) g_console.viewports.custom_vp.x += 4; else if(input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) g_console.viewports.custom_vp.x += 1; if(input & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_UP)) g_console.viewports.custom_vp.y += 4; else if(input & (1 << RETRO_DEVICE_ID_JOYPAD_UP)) g_console.viewports.custom_vp.y += 1; if(input & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_DOWN)) g_console.viewports.custom_vp.y -= 4; else if(input & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) g_console.viewports.custom_vp.y -= 1; if(input & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_LEFT)) g_console.viewports.custom_vp.width -= 4; else if(input & (1 << RETRO_DEVICE_ID_JOYPAD_L)) g_console.viewports.custom_vp.width -= 1; if (input & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_RIGHT)) g_console.viewports.custom_vp.width += 4; else if(input & (1 << RETRO_DEVICE_ID_JOYPAD_R)) g_console.viewports.custom_vp.width += 1; if(input & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_UP)) g_console.viewports.custom_vp.height += 4; else if(input & (1 << RETRO_DEVICE_ID_JOYPAD_L2)) g_console.viewports.custom_vp.height += 1; if(input & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_DOWN)) g_console.viewports.custom_vp.height -= 4; else if (input & (1 << RETRO_DEVICE_ID_JOYPAD_R2)) g_console.viewports.custom_vp.height -= 1; if (input & (1 << RETRO_DEVICE_ID_JOYPAD_X)) { g_console.viewports.custom_vp.x = 0; g_console.viewports.custom_vp.y = 0; g_console.viewports.custom_vp.width = device_ptr->win_width; g_console.viewports.custom_vp.height = device_ptr->win_height; } if (input & (1 << RETRO_DEVICE_ID_JOYPAD_A)) menu_stack_decrement(); if((input & (1 << RETRO_DEVICE_ID_JOYPAD_Y)) && (old_state & (1 << RETRO_DEVICE_ID_JOYPAD_Y))) { } else { char viewport_x[64], viewport_y[64], viewport_w[64], viewport_h[64]; display_menubar(current_menu); snprintf(viewport_x, sizeof(viewport_x), "Viewport X: #%d", g_console.viewports.custom_vp.x); snprintf(viewport_y, sizeof(viewport_y), "Viewport Y: #%d", g_console.viewports.custom_vp.y); snprintf(viewport_w, sizeof(viewport_w), "Viewport Width: #%d", g_console.viewports.custom_vp.width); snprintf(viewport_h, sizeof(viewport_h), "Viewport Height: #%d", g_console.viewports.custom_vp.height); render_msg_place_func(x_position, y_position, font_size, GREEN, viewport_x); render_msg_place_func(x_position, y_position+(y_position_increment*1), font_size, GREEN, viewport_y); render_msg_place_func(x_position, y_position+(y_position_increment*2), font_size, GREEN, viewport_w); render_msg_place_func(x_position, y_position+(y_position_increment*3), font_size, GREEN, viewport_h); render_msg_place_func(x_position, y_position+(y_position_increment*4), font_size, LIGHTBLUE, "CONTROLS:"); render_msg_place_func (x_position, y_position+(y_position_increment*5), font_size, LIGHTBLUE, "LEFT or LSTICK UP"); render_msg_place_func (0.5f, y_position+(y_position_increment*5), font_size, LIGHTBLUE, "- Decrease Viewport X"); render_msg_post_func(); render_msg_place_func (x_position, y_position+(y_position_increment*6), font_size, LIGHTBLUE, "RIGHT or LSTICK RIGHT"); render_msg_place_func (0.5f, y_position+(y_position_increment*6), font_size, LIGHTBLUE, "- Increase Viewport X"); render_msg_place_func (x_position, y_position+(y_position_increment*7), font_size, LIGHTBLUE, "UP or LSTICK UP"); render_msg_place_func (0.5f, y_position+(y_position_increment*7), font_size, LIGHTBLUE, "- Increase Viewport Y"); render_msg_post_func(); render_msg_place_func (x_position, y_position+(y_position_increment*8), font_size, LIGHTBLUE, "DOWN or LSTICK DOWN"); render_msg_place_func (0.5f, y_position+(y_position_increment*8), font_size, LIGHTBLUE, "- Decrease Viewport Y"); render_msg_place_func (x_position, y_position+(y_position_increment*9), font_size, LIGHTBLUE, "L1 or RSTICK LEFT"); render_msg_place_func (0.5f, y_position+(y_position_increment*9), font_size, LIGHTBLUE, "- Decrease Viewport Width"); render_msg_post_func(); render_msg_place_func (x_position, y_position+(y_position_increment*10), font_size, LIGHTBLUE, "R1 or RSTICK RIGHT"); render_msg_place_func (0.5f, y_position+(y_position_increment*10), font_size, LIGHTBLUE, "- Increase Viewport Width"); render_msg_place_func (x_position, y_position+(y_position_increment*11), font_size, LIGHTBLUE, "L2 or RSTICK UP"); render_msg_place_func (0.5f, y_position+(y_position_increment*11), font_size, LIGHTBLUE, "- Increase Viewport Height"); render_msg_post_func(); render_msg_place_func (x_position, y_position+(y_position_increment*12), font_size, LIGHTBLUE, "R2 or RSTICK DOWN"); render_msg_place_func (0.5f, y_position+(y_position_increment*12), font_size, LIGHTBLUE, "- Decrease Viewport Height"); render_msg_place_func (x_position, y_position+(y_position_increment*13), font_size, LIGHTBLUE, "TRIANGLE"); render_msg_place_func (0.5f, y_position+(y_position_increment*13), font_size, LIGHTBLUE, "- Reset To Defaults"); render_msg_place_func (x_position, y_position+(y_position_increment*14), font_size, LIGHTBLUE, "SQUARE"); render_msg_place_func (0.5f, y_position+(y_position_increment*14), font_size, LIGHTBLUE, "- Show Game Screen"); render_msg_place_func (x_position, y_position+(y_position_increment*15), font_size, LIGHTBLUE, "CIRCLE"); render_msg_place_func (0.5f, y_position+(y_position_increment*15), font_size, LIGHTBLUE, "- Return to Ingame Menu"); render_msg_post_func(); render_msg_place_func (x_position, comment_y_position, font_size, LIGHTBLUE, "Allows you to resize the screen by moving around the two analog sticks.\nPress TRIANGLE to reset to default values, and CIRCLE to go back to the menu."); render_msg_post_func(); } } static void ingame_menu_screenshot(item *items, menu *current_menu, uint64_t input) { (void)items; (void)current_menu; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; if(g_console.ingame_menu_enable) { if(input & (1 << RETRO_DEVICE_ID_JOYPAD_A)) { menu_stack_decrement(); device_ptr->menu_render = true; } } } static void ingame_menu(item *items, menu *current_menu, uint64_t input) { char comment[256], overscan_msg[64]; static unsigned menuitem_colors[MENU_ITEM_LAST]; DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; float x_position = 0.09f; float y_position = 0.16f; float comment_y_position = 0.83f; float font_size = 0.91f; float y_position_increment = 0.035f; for(int i = 0; i < MENU_ITEM_LAST; i++) menuitem_colors[i] = GREEN; menuitem_colors[g_console.ingame_menu_item] = RED; if(input & (1 << RETRO_DEVICE_ID_JOYPAD_A)) rarch_settings_change(S_RETURN_TO_GAME); switch(g_console.ingame_menu_item) { case MENU_ITEM_LOAD_STATE: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) { rarch_load_state(); rarch_settings_change(S_RETURN_TO_GAME); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) rarch_state_slot_decrease(); if(input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) rarch_state_slot_increase(); strlcpy(comment, "Press LEFT or RIGHT to change the current save state slot.\nPress CROSS to load the state from the currently selected save state slot.", sizeof(comment)); break; case MENU_ITEM_SAVE_STATE: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) { rarch_save_state(); rarch_settings_change(S_RETURN_TO_GAME); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) rarch_state_slot_decrease(); if(input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) rarch_state_slot_increase(); strlcpy(comment, "Press LEFT or RIGHT to change the current save state slot.\nPress CROSS to save the state to the currently selected save state slot.", sizeof(comment)); break; case MENU_ITEM_KEEP_ASPECT_RATIO: producesettingentry(current_menu, items, SETTING_KEEP_ASPECT_RATIO, input); strlcpy(comment, "Press LEFT or RIGHT to change the [Aspect Ratio].\nPress START to reset back to default values.", sizeof(comment)); break; case MENU_ITEM_OVERSCAN_AMOUNT: producesettingentry(current_menu, items, SETTING_HW_OVERSCAN_AMOUNT, input); strlcpy(comment, "Press LEFT or RIGHT to change the [Overscan] settings.\nPress START to reset back to default values.", sizeof(comment)); break; case MENU_ITEM_ORIENTATION: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) { rarch_settings_change(S_ROTATION_DECREMENT); video_gl.set_rotation(NULL, g_console.screen_orientation); } if((input & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_B))) { rarch_settings_change(S_ROTATION_INCREMENT); video_gl.set_rotation(NULL, g_console.screen_orientation); } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_START)) { rarch_settings_default(S_DEF_ROTATION); video_gl.set_rotation(NULL, g_console.screen_orientation); } strlcpy(comment, "Press LEFT or RIGHT to change the [Orientation] settings.\nPress START to reset back to default values.", sizeof(comment)); break; case MENU_ITEM_SCALE_FACTOR: producesettingentry(current_menu, items, SETTING_SCALE_FACTOR, input); strlcpy(comment, "Press LEFT or RIGHT to change the [Scaling] settings.\nPress START to reset back to default values.", sizeof(comment)); break; case MENU_ITEM_FRAME_ADVANCE: if((input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_R2)) || (input & (1 << RETRO_DEVICE_ID_JOYPAD_L2))) { rarch_settings_change(S_FRAME_ADVANCE); g_console.ingame_menu_item = MENU_ITEM_FRAME_ADVANCE; } strlcpy(comment, "Press 'CROSS', 'L2' or 'R2' button to step one frame. Pressing the button\nrapidly will advance the frame more slowly.", sizeof(comment)); break; case MENU_ITEM_RESIZE_MODE: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) menu_stack_push(items, INGAME_MENU_RESIZE); strlcpy(comment, "Allows you to resize the screen by moving around the two analog sticks.\nPress TRIANGLE to reset to default values, and CIRCLE to go back.", sizeof(comment)); break; case MENU_ITEM_SCREENSHOT_MODE: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) menu_stack_push(items, INGAME_MENU_SCREENSHOT); strlcpy(comment, "Allows you to take a screenshot without any text clutter.\nPress CIRCLE to go back to the in-game menu while in 'Screenshot Mode'.", sizeof(comment)); break; case MENU_ITEM_RETURN_TO_GAME: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) rarch_settings_change(S_RETURN_TO_GAME); strlcpy(comment, "Press 'CROSS' to return back to the game.", sizeof(comment)); break; case MENU_ITEM_RESET: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) { rarch_settings_change(S_RETURN_TO_GAME); rarch_game_reset(); } strlcpy(comment, "Press 'CROSS' to reset the game.", sizeof(comment)); break; case MENU_ITEM_RETURN_TO_MENU: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) { rarch_settings_change(S_RETURN_TO_MENU); } strlcpy(comment, "Press 'CROSS' to return to the ROM Browser menu.", sizeof(comment)); break; case MENU_ITEM_CHANGE_LIBRETRO: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) { menu_stack_push(items, LIBRETRO_CHOICE); filebrowser_set_root_and_ext(&tmpBrowser, EXT_EXECUTABLES, default_paths.core_dir); set_libretro_core_as_launch = true; } strlcpy(comment, "Press 'CROSS' to choose a different emulator core.", sizeof(comment)); break; #ifdef HAVE_MULTIMAN case MENU_ITEM_RETURN_TO_MULTIMAN: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) { if(path_file_exists(default_paths.multiman_self_file)) { strlcpy(g_console.launch_app_on_exit, default_paths.multiman_self_file, sizeof(g_console.launch_app_on_exit)); rarch_settings_change(S_RETURN_TO_DASHBOARD); } } strlcpy(comment, "Press 'CROSS' to quit the emulator and return to multiMAN.", sizeof(comment)); break; #endif case MENU_ITEM_RETURN_TO_DASHBOARD: if(input & (1 << RETRO_DEVICE_ID_JOYPAD_B)) rarch_settings_change(S_RETURN_TO_DASHBOARD); strlcpy(comment, "Press 'CROSS' to quit the emulator and return to the XMB.", sizeof(comment)); break; } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_UP)) { if(g_console.ingame_menu_item > 0) g_console.ingame_menu_item--; } if(input & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) { if(g_console.ingame_menu_item < (MENU_ITEM_LAST-1)) g_console.ingame_menu_item++; } if((input & (1 << RETRO_DEVICE_ID_JOYPAD_L3)) && (input & (1 << RETRO_DEVICE_ID_JOYPAD_R3))) rarch_settings_change(S_RETURN_TO_GAME); display_menubar(current_menu); rarch_settings_create_menu_item_label(strw_buffer, S_LBL_LOAD_STATE_SLOT, sizeof(strw_buffer)); render_msg_place_func(x_position, y_position, font_size, MENU_ITEM_SELECTED(MENU_ITEM_LOAD_STATE), strw_buffer); rarch_settings_create_menu_item_label(strw_buffer, S_LBL_SAVE_STATE_SLOT, sizeof(strw_buffer)); render_msg_place_func(x_position, y_position+(y_position_increment*MENU_ITEM_SAVE_STATE), font_size, MENU_ITEM_SELECTED(MENU_ITEM_SAVE_STATE), strw_buffer); render_msg_post_func(); rarch_settings_create_menu_item_label(strw_buffer, S_LBL_ASPECT_RATIO, sizeof(strw_buffer)); render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_KEEP_ASPECT_RATIO)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_KEEP_ASPECT_RATIO), strw_buffer); snprintf(overscan_msg, sizeof(overscan_msg), "Overscan: %f", g_console.overscan_amount); render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_OVERSCAN_AMOUNT)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_OVERSCAN_AMOUNT), overscan_msg); rarch_settings_create_menu_item_label(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); render_msg_place_func (x_position, (y_position+(y_position_increment*MENU_ITEM_ORIENTATION)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_ORIENTATION), strw_buffer); render_msg_post_func(); rarch_settings_create_menu_item_label(strw_buffer, S_LBL_SCALE_FACTOR, sizeof(strw_buffer)); render_msg_place_func (x_position, (y_position+(y_position_increment*MENU_ITEM_SCALE_FACTOR)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_SCALE_FACTOR), strw_buffer); render_msg_post_func(); render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_RESIZE_MODE)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_RESIZE_MODE), "Resize Mode"); render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_FRAME_ADVANCE)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_FRAME_ADVANCE), "Frame Advance"); render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_SCREENSHOT_MODE)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_SCREENSHOT_MODE), "Screenshot Mode"); render_msg_post_func(); render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_RESET)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_RESET), "Reset"); render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_RETURN_TO_GAME)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_RETURN_TO_GAME), "Return to Game"); render_msg_post_func(); render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_RETURN_TO_MENU)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_RETURN_TO_MENU), "Return to Menu"); render_msg_post_func(); render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_CHANGE_LIBRETRO)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_CHANGE_LIBRETRO), "Change libretro core"); render_msg_post_func(); #ifdef HAVE_MULTIMAN render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_RETURN_TO_MULTIMAN)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_RETURN_TO_MULTIMAN), "Return to multiMAN"); #endif render_msg_place_func(x_position, (y_position+(y_position_increment*MENU_ITEM_RETURN_TO_DASHBOARD)), font_size, MENU_ITEM_SELECTED(MENU_ITEM_RETURN_TO_DASHBOARD), "Return to XMB"); render_msg_post_func(); render_msg_place_func(x_position, comment_y_position, font_size, LIGHTBLUE, comment); render_msg_post_func(); } void menu_init (void) { //Set libretro filename and version to variable struct retro_system_info info; retro_get_system_info(&info); const char *id = info.library_name ? info.library_name : "Unknown"; snprintf(core_text, sizeof(core_text), "Libretro core: %s %s", id, info.library_version); menu_stack_push(menu_items, FILE_BROWSER_MENU); filebrowser_set_root_and_ext(&browser, rarch_console_get_rom_ext(), default_paths.filebrowser_startup_dir); filebrowser_set_root(&tmpBrowser, "/"); } void menu_free (void) { filebrowser_free(&browser); filebrowser_free(&tmpBrowser); } void menu_loop(void) { DEVICE_CAST device_ptr = (DEVICE_CAST)driver.video_data; g_console.menu_enable = true; device_ptr->block_swap = true; if(g_console.ingame_menu_enable) menu_stack_push(ingame_menu_settings, INGAME_MENU); do { //first button input frame uint64_t input_state_first_frame = 0; uint64_t input_state = 0; static bool first_held = false; menu *current_menu = menu_stack_get_current_ptr(); input_ps3.poll(NULL); static const struct retro_keybind *binds[MAX_PLAYERS] = { g_settings.input.binds[0], g_settings.input.binds[1], g_settings.input.binds[2], g_settings.input.binds[3], g_settings.input.binds[4], g_settings.input.binds[5], g_settings.input.binds[6], g_settings.input.binds[7], }; static const struct retro_keybind _analog_binds[] = { { 0, 0, (enum retro_key)0, (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_LEFT), 0 }, { 0, 0, (enum retro_key)0, (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_RIGHT), 0 }, { 0, 0, (enum retro_key)0, (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_UP), 0 }, { 0, 0, (enum retro_key)0, (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_DOWN), 0 }, { 0, 0, (enum retro_key)0, (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_LEFT), 0 }, { 0, 0, (enum retro_key)0, (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_RIGHT), 0 }, { 0, 0, (enum retro_key)0, (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_UP), 0 }, { 0, 0, (enum retro_key)0, (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_DOWN), 0 }, }; const struct retro_keybind *analog_binds[] = { _analog_binds }; for (unsigned i = 0; i < RARCH_FIRST_META_KEY; i++) { input_state |= input_ps3.input_state(NULL, binds, false, RETRO_DEVICE_JOYPAD, 0, i) ? (1 << i) : 0; } input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 0) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_LEFT) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 1) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_RIGHT) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 2) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_UP) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 3) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_DOWN) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 4) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_LEFT) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 5) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_RIGHT) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 6) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_UP) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 7) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_DOWN) : 0; uint64_t trig_state = input_state & ~old_state; //set first button input frame as trigger input_state_first_frame = input_state; //hold onto first button input frame //second button input frame input_state = 0; input_ps3.poll(NULL); for (unsigned i = 0; i < RARCH_FIRST_META_KEY; i++) { input_state |= input_ps3.input_state(NULL, binds, false, RETRO_DEVICE_JOYPAD, 0, i) ? (1 << i) : 0; } input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 0) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_LEFT) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 1) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_RIGHT) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 2) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_UP) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 3) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_DOWN) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 4) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_LEFT) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 5) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_RIGHT) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 6) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_UP) : 0; input_state |= input_ps3.input_state(NULL, analog_binds, false, RETRO_DEVICE_JOYPAD, 0, 7) ? (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_DOWN) : 0; bool analog_sticks_pressed = (input_state & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_LEFT)) || (input_state & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_RIGHT)) || (input_state & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_UP)) || (input_state & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_LEFT_DPAD_DOWN)) || (input_state & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_LEFT)) || (input_state & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_RIGHT)) || (input_state & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_UP)) || (input_state & (1 << RETRO_DEVICE_ID_JOYPAD_ANALOG_RIGHT_DPAD_DOWN)); bool shoulder_buttons_pressed = ((input_state & (1 << RETRO_DEVICE_ID_JOYPAD_L2)) || (input_state & (1 << RETRO_DEVICE_ID_JOYPAD_R2))) && current_menu->category_id != CATEGORY_SETTINGS; bool do_held = analog_sticks_pressed || shoulder_buttons_pressed; if(do_held) { if(!first_held) { first_held = true; SET_TIMER_EXPIRATION(device_ptr, 7); } if(IS_TIMER_EXPIRED(device_ptr)) { first_held = false; trig_state = input_state; //second input frame set as current frame } } gfx_ctx_clear(); if(current_menu->enum_id == INGAME_MENU_RESIZE && (trig_state & RETRO_DEVICE_ID_JOYPAD_Y) || current_menu->enum_id == INGAME_MENU_SCREENSHOT) device_ptr->menu_render = false; else { gfx_ctx_set_blend(true); device_ptr->menu_render = true; } rarch_render_cached_frame(); filebrowser_t * fb = &browser; switch(current_menu->enum_id) { case FILE_BROWSER_MENU: select_rom(menu_items, current_menu, trig_state); fb = &browser; break; case GENERAL_VIDEO_MENU: case GENERAL_AUDIO_MENU: case EMU_GENERAL_MENU: case EMU_VIDEO_MENU: case EMU_AUDIO_MENU: case PATH_MENU: case CONTROLS_MENU: select_setting(menu_items, current_menu, trig_state); break; case SHADER_CHOICE: case PRESET_CHOICE: case BORDER_CHOICE: case LIBRETRO_CHOICE: case INPUT_PRESET_CHOICE: select_file(menu_items, current_menu, trig_state); fb = &tmpBrowser; break; case PATH_SAVESTATES_DIR_CHOICE: case PATH_DEFAULT_ROM_DIR_CHOICE: case PATH_CHEATS_DIR_CHOICE: case PATH_SRAM_DIR_CHOICE: select_directory(menu_items, current_menu, trig_state); fb = &tmpBrowser; break; case INGAME_MENU: if(g_console.ingame_menu_enable) ingame_menu(menu_items, current_menu, trig_state); break; case INGAME_MENU_RESIZE: ingame_menu_resize(menu_items, current_menu, trig_state); break; case INGAME_MENU_SCREENSHOT: ingame_menu_screenshot(menu_items, current_menu, trig_state); break; } float x_position = 0.09f; float starting_y_position = 0.10f; float y_position_increment = 0.035f; switch(current_menu->category_id) { case CATEGORY_FILEBROWSER: browser_render(fb, x_position, starting_y_position, y_position_increment); break; case CATEGORY_SETTINGS: case CATEGORY_INGAME_MENU: default: break; } old_state = input_state_first_frame; if(IS_TIMER_EXPIRED(device_ptr)) { // if we want to force goto the emulation loop, skip this if(g_console.mode_switch != MODE_EMULATION) { // for ingame menu, we need a different precondition because menu_enable // can be set to false when going back from ingame menu to menu if(g_console.ingame_menu_enable == true) { //we want to force exit when mode_switch is set to MODE_EXIT if(g_console.mode_switch != MODE_EXIT) g_console.mode_switch = (((old_state & (1 << RETRO_DEVICE_ID_JOYPAD_L3)) && (old_state & (1 << RETRO_DEVICE_ID_JOYPAD_R3)) && g_console.emulator_initialized)) ? MODE_EMULATION : MODE_MENU; } else { g_console.menu_enable = !(((old_state & (1 << RETRO_DEVICE_ID_JOYPAD_L3)) && (old_state & (1 << RETRO_DEVICE_ID_JOYPAD_R3)) && g_console.emulator_initialized)); g_console.mode_switch = g_console.menu_enable ? MODE_MENU : MODE_EMULATION; } } } // set a timer delay so that we don't instantly switch back to the menu when // press and holding L3 + R3 in the emulation loop (lasts for 30 frame ticks) if(g_console.mode_switch == MODE_EMULATION && !g_console.frame_advance_enable) { SET_TIMER_EXPIRATION(device_ptr, 30); } const char * message = msg_queue_pull(g_extern.msg_queue); if (message && g_console.info_msg_enable) { render_msg_place_func(g_settings.video.msg_pos_x, 0.75f, 1.05f, WHITE, message); render_msg_post_func(); } gfx_ctx_swap_buffers(); #ifdef HAVE_SYSUTILS cellSysutilCheckCallback(); #endif if(current_menu->enum_id == INGAME_MENU_RESIZE && (old_state & (1 << RETRO_DEVICE_ID_JOYPAD_Y)) || current_menu->enum_id == INGAME_MENU_SCREENSHOT) { } else gfx_ctx_set_blend(false); }while(g_console.menu_enable); device_ptr->menu_render = false; if(g_console.ingame_menu_enable) menu_stack_decrement(); device_ptr->block_swap = false; g_console.ingame_menu_enable = false; }