diff --git a/console/rarch_console_libretro_mgmt.h b/console/rarch_console_libretro_mgmt.h index c9f46ebd7d..8b966db2b2 100644 --- a/console/rarch_console_libretro_mgmt.h +++ b/console/rarch_console_libretro_mgmt.h @@ -23,7 +23,10 @@ enum { EXTERN_LAUNCHER_SALAMANDER, #ifdef HAVE_MULTIMAN - EXTERN_LAUNCHER_MULTIMAN + EXTERN_LAUNCHER_MULTIMAN, +#endif +#ifdef HW_RVL + EXTERN_LAUNCHER_CHANNEL, #endif }; diff --git a/console/rgui/rgui.c b/console/rgui/rgui.c index cdbf5559c2..72e9e130bf 100644 --- a/console/rgui/rgui.c +++ b/console/rgui/rgui.c @@ -271,7 +271,7 @@ static void render_messagebox(rgui_handle_t *rgui, const char *message) static void render_text(rgui_handle_t *rgui) { - if (rgui->need_refresh && g_console.mode_switch == MODE_MENU) + if (rgui->need_refresh && g_console.mode_switch == MODE_MENU && !rgui->msg_force) return; size_t begin = rgui->directory_ptr >= TERM_HEIGHT / 2 ? @@ -776,6 +776,7 @@ void rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action) } driver.video->apply_state_changes(); break; + case RGUI_ACTION_DOWN: if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) { @@ -788,6 +789,7 @@ void rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action) } driver.video->apply_state_changes(); break; + case RGUI_ACTION_LEFT: if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) { @@ -800,6 +802,7 @@ void rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action) } driver.video->apply_state_changes(); break; + case RGUI_ACTION_RIGHT: if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) { @@ -812,6 +815,7 @@ void rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action) } driver.video->apply_state_changes(); break; + case RGUI_ACTION_CANCEL: if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2) { @@ -823,6 +827,7 @@ void rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action) rgui_list_pop(rgui->path_stack); } break; + case RGUI_ACTION_OK: if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) { @@ -834,6 +839,7 @@ void rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action) rgui_list_pop(rgui->path_stack); } break; + case RGUI_ACTION_START: #ifdef GEKKO if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT) @@ -851,9 +857,15 @@ void rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action) #endif driver.video->apply_state_changes(); break; + case RGUI_ACTION_SETTINGS: rgui_list_pop(rgui->path_stack); break; + + case RGUI_ACTION_MESSAGE: + rgui->msg_force = true; + break; + default: break; } @@ -933,6 +945,10 @@ void rgui_settings_iterate(rgui_handle_t *rgui, rgui_action_t action) rgui->need_refresh = true; break; + case RGUI_ACTION_MESSAGE: + rgui->msg_force = true; + break; + default: break; } @@ -964,7 +980,7 @@ void rgui_iterate(rgui_handle_t *rgui, rgui_action_t action) return rgui_settings_iterate(rgui, action); else if (rgui_is_viewport_menu(menu_type)) return rgui_viewport_iterate(rgui, action); - if (rgui->need_refresh) + if (rgui->need_refresh && action != RGUI_ACTION_MESSAGE) action = RGUI_ACTION_NOOP; switch (action) @@ -1078,6 +1094,10 @@ void rgui_iterate(rgui_handle_t *rgui, rgui_action_t action) } return rgui_settings_iterate(rgui, RGUI_ACTION_REFRESH); + case RGUI_ACTION_MESSAGE: + rgui->msg_force = true; + break; + default: break; } diff --git a/console/rgui/rgui.h b/console/rgui/rgui.h index 2a4c639093..8ec3e98e25 100644 --- a/console/rgui/rgui.h +++ b/console/rgui/rgui.h @@ -90,6 +90,7 @@ typedef enum RGUI_ACTION_REFRESH, RGUI_ACTION_SETTINGS, RGUI_ACTION_START, + RGUI_ACTION_MESSAGE, RGUI_ACTION_NOOP } rgui_action_t; diff --git a/gx/frontend/main.c b/gx/frontend/main.c index 06b90fce2b..3bd570aa22 100644 --- a/gx/frontend/main.c +++ b/gx/frontend/main.c @@ -27,6 +27,7 @@ #include "../../console/rarch_console_exec.h" #include "../../console/rarch_console_input.h" #include "../../console/rarch_console_main_wrap.h" +#include "../../console/rarch_console_settings.h" #include "../mem2_manager.h" @@ -379,9 +380,9 @@ static void menu_init(void) rgui = rgui_init("", menu_framebuf, RGUI_WIDTH * sizeof(uint32_t), NULL /* _binary_console_font_bmp_start */, _binary_console_font_bin_start, folder_cb, NULL); - rgui_iterate(rgui, RGUI_ACTION_REFRESH); g_console.mode_switch = MODE_MENU; + rgui_iterate(rgui, RGUI_ACTION_REFRESH); } static void menu_free(void) @@ -401,16 +402,16 @@ static void get_environment_settings(void) if (device_end) snprintf(default_paths.port_dir, sizeof(default_paths.port_dir), "%.*s/retroarch", device_end - default_paths.core_dir, default_paths.core_dir); else - snprintf(default_paths.port_dir, sizeof(default_paths.port_dir), "/retroarch"); + strlcpy(default_paths.port_dir, "/retroarch", sizeof(default_paths.port_dir)); snprintf(default_paths.config_file, sizeof(default_paths.config_file), "%s/retroarch.cfg", default_paths.port_dir); snprintf(default_paths.system_dir, sizeof(default_paths.system_dir), "%s/system", default_paths.port_dir); snprintf(default_paths.savestate_dir, sizeof(default_paths.savestate_dir), "%s/savestates", default_paths.port_dir); - snprintf(default_paths.filesystem_root_dir, sizeof(default_paths.filesystem_root_dir), "/"); + strlcpy(default_paths.filesystem_root_dir, "/", sizeof(default_paths.filesystem_root_dir)); snprintf(default_paths.filebrowser_startup_dir, sizeof(default_paths.filebrowser_startup_dir), default_paths.filesystem_root_dir); snprintf(default_paths.sram_dir, sizeof(default_paths.sram_dir), "%s/sram", default_paths.port_dir); snprintf(default_paths.input_presets_dir, sizeof(default_paths.input_presets_dir), "%s/input", default_paths.port_dir); strlcpy(default_paths.executable_extension, ".dol", sizeof(default_paths.executable_extension)); - snprintf(default_paths.salamander_file, sizeof(default_paths.salamander_file), "boot.dol"); + strlcpy(default_paths.salamander_file, "boot.dol", sizeof(default_paths.salamander_file)); } #define MAKE_FILE(x) {\ @@ -448,7 +449,7 @@ static void make_directories(void) MAKE_FILE(default_paths.config_file); } -int main(void) +int main(int argc, char *argv[]) { #ifdef HW_RVL IOS_ReloadIOS(IOS_GetVersion()); @@ -521,6 +522,26 @@ int main(void) menu_init(); + if (argc > 2 && argv[1] != NULL && argv[2] != NULL) + { + char rom[PATH_MAX]; + g_console.external_launcher_support = EXTERN_LAUNCHER_CHANNEL; + snprintf(rom, sizeof(rom), "%s%s", argv[1], argv[2]); + g_console.zip_extract_mode = ZIP_EXTRACT_TO_CURRENT_DIR_AND_LOAD_FIRST_FILE; + rarch_console_load_game_wrap(rom, g_console.zip_extract_mode, S_DELAY_1); + + rgui_iterate(rgui, RGUI_ACTION_MESSAGE); + gx->menu_render = true; + rarch_render_cached_frame(); + gx->menu_render = false; + + rarch_startup(default_paths.config_file); + } + else + { + g_console.external_launcher_support = EXTERN_LAUNCHER_SALAMANDER; + } + begin_loop: if(g_console.mode_switch == MODE_EMULATION) { @@ -551,6 +572,7 @@ begin_loop: begin_shutdown: rarch_config_save(default_paths.config_file); + config_save_keybinds(input_path); if(g_console.emulator_initialized) rarch_main_deinit(); @@ -568,8 +590,7 @@ begin_shutdown: if(g_console.return_to_launcher) rarch_console_exec(g_console.launch_app_on_exit); - config_save_keybinds(input_path); - return 1; + exit(0); } diff --git a/gx/mem2_manager.c b/gx/mem2_manager.c index 85c70ca2fa..b55e755b7b 100644 --- a/gx/mem2_manager.c +++ b/gx/mem2_manager.c @@ -18,22 +18,25 @@ u32 MALLOC_MEM2 = 0; static __inline__ heap_block *__lwp_heap_blockat(heap_block *block, u32 offset) { - return (heap_block*) ((char*) block + offset); + return (heap_block *) ((char *) block + offset); } static __inline__ heap_block *__lwp_heap_usrblockat(void *ptr) { - u32 offset = *(((u32*) ptr) - 1); + u32 offset = *(((u32 *) ptr) - 1); return __lwp_heap_blockat(ptr, -offset + -HEAP_BLOCK_USED_OVERHEAD); } + static __inline__ bool __lwp_heap_blockin(heap_cntrl *heap, heap_block *block) { - return ((u32) block >= (u32) heap->start && (u32) block <= (u32)heap->final); + return ((u32) block >= (u32) heap->start && (u32) block <= (u32) heap->final); } + static __inline__ bool __lwp_heap_blockfree(heap_block *block) { return !(block->front_flag & HEAP_BLOCK_USED); } + static __inline__ u32 __lwp_heap_blocksize(heap_block *block) { return (block->front_flag & ~HEAP_BLOCK_USED);