From 12cc1c43d463a46e119959c5995ea2356d4cf841 Mon Sep 17 00:00:00 2001 From: Themaister Date: Sat, 16 Mar 2013 10:35:22 +0100 Subject: [PATCH] Can almost run RGUI on PC. Input in menu is broken. Binds are set up wrongly for PC. --- config.def.h | 4 +++ frontend/frontend.c | 63 +++++++++++++++++++++++++++++++++++++++++++- frontend/menu/rgui.c | 47 ++++++++------------------------- frontend/menu/rgui.h | 4 +++ general.h | 1 + retroarch.c | 10 ++++--- 6 files changed, 89 insertions(+), 40 deletions(-) diff --git a/config.def.h b/config.def.h index f10124c670..77ccaddd75 100644 --- a/config.def.h +++ b/config.def.h @@ -546,6 +546,8 @@ static const bool input_autodetect_enable = true; #define RETRO_LBL_OVERLAY_NEXT "Next Overlay" #define RETRO_LBL_DISK_EJECT_TOGGLE "Disk Eject Toggle" #define RETRO_LBL_DISK_NEXT "Disk Swap Next" +#define RETRO_LBL_MENU_TOGGLE "Menu toggle" +#define RETRO_LBL_MENU_QUICKMENU_TOGGLE "Menu quickmenu toggle" // Player 1 static const struct retro_keybind retro_keybinds_1[] = { @@ -616,6 +618,8 @@ static const struct retro_keybind retro_keybinds_1[] = { { true, RARCH_OVERLAY_NEXT, RETRO_LBL_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_DISK_EJECT_TOGGLE, RETRO_LBL_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_DISK_NEXT, RETRO_LBL_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MENU_TOGGLE, RETRO_LBL_MENU_TOGGLE, RETROK_F1, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MENU_QUICKMENU_TOGGLE, RETRO_LBL_MENU_QUICKMENU_TOGGLE,RETROK_F1, NO_BTN, 0, AXIS_NONE }, }; // Player 2-5 diff --git a/frontend/frontend.c b/frontend/frontend.c index 25774c5e2c..5edcaeeb3f 100644 --- a/frontend/frontend.c +++ b/frontend/frontend.c @@ -16,6 +16,10 @@ #include "../general.h" +#ifdef HAVE_RGUI +#include "../frontend/menu/rgui.h" +#endif + #ifdef __APPLE__ #include "SDL.h" // OSX seems to really need -lSDLmain, @@ -29,11 +33,68 @@ int main(int argc, char *argv[]) // Consoles use the higher level API. return rarch_main(argc, argv); #else + rarch_init_msg_queue(); + int init_ret; if ((init_ret = rarch_main_init(argc, argv))) return init_ret; - rarch_init_msg_queue(); + +#ifdef HAVE_RGUI + menu_init(); + g_extern.lifecycle_mode_state |= 1ULL << MODE_GAME; + + for (;;) + { + if (g_extern.lifecycle_mode_state & (1ULL << MODE_GAME)) + { + while ((g_extern.is_paused && !g_extern.is_oneshot) ? rarch_main_idle_iterate() : rarch_main_iterate()); + g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME); + } + else if (g_extern.lifecycle_mode_state & (1ULL << MODE_INIT)) + { + if (g_extern.main_is_init) + rarch_main_deinit(); + + struct rarch_main_wrap args = {0}; + + args.verbose = g_extern.verbose; + args.config_path = *g_extern.config_path ? g_extern.config_path : NULL; + args.sram_path = NULL; + args.state_path = NULL; + args.rom_path = g_extern.fullpath; + args.libretro_path = g_settings.libretro; + + int init_ret = rarch_main_init_wrap(&args); + if (init_ret == 0) + { + RARCH_LOG("rarch_main_init() succeeded.\n"); + g_extern.lifecycle_mode_state |= (1ULL << MODE_GAME); + } + else + { + RARCH_ERR("rarch_main_init() failed.\n"); + g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU); + } + + g_extern.lifecycle_mode_state &= ~(1ULL << MODE_INIT); + } + else if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU)) + { + g_extern.lifecycle_mode_state |= 1ULL << MODE_MENU_PREINIT; + while (menu_iterate()); + g_extern.lifecycle_mode_state &= ~(1ULL << MODE_MENU); + } + else + break; + } + + menu_free(); + if (g_extern.main_is_init) + rarch_main_deinit(); +#else while ((g_extern.is_paused && !g_extern.is_oneshot) ? rarch_main_idle_iterate() : rarch_main_iterate()); rarch_main_deinit(); +#endif + rarch_deinit_msg_queue(); #ifdef PERF_TEST diff --git a/frontend/menu/rgui.c b/frontend/menu/rgui.c index 7d1a99946b..e0c66dad30 100644 --- a/frontend/menu/rgui.c +++ b/frontend/menu/rgui.c @@ -289,25 +289,27 @@ static void fill_rect(uint16_t *buf, unsigned pitch, } static void blit_line(rgui_handle_t *rgui, - unsigned x, unsigned y, const char *message, bool green) + int x, int y, const char *message, bool green) { while (*message) { - for (unsigned j = 0; j < FONT_HEIGHT; j++) + for (int j = 0; j < FONT_HEIGHT; j++) { - for (unsigned i = 0; i < FONT_WIDTH; i++) + for (int i = 0; i < FONT_WIDTH; i++) { uint8_t rem = 1 << ((i + j * FONT_WIDTH) & 7); - unsigned offset = (i + j * FONT_WIDTH) >> 3; + int offset = (i + j * FONT_WIDTH) >> 3; bool col = (rgui->font[FONT_OFFSET((unsigned char)*message) + offset] & rem); if (col) + { rgui->frame_buf[(y + j) * (rgui->frame_buf_pitch >> 1) + (x + i)] = green ? #ifdef GEKKO (3 << 0) | (10 << 4) | (3 << 8) | (7 << 12) : 0x7FFF; #else (15 << 0) | (7 << 4) | (15 << 8) | (7 << 12) : 0xFFFF; #endif + } } } @@ -350,8 +352,8 @@ static void render_messagebox(rgui_handle_t *rgui, const char *message) unsigned width = strlen(msg) * FONT_WIDTH_STRIDE - 1 + 6 + 10; unsigned height = FONT_HEIGHT + 6 + 10; - unsigned x = (RGUI_WIDTH - width) / 2; - unsigned y = (RGUI_HEIGHT - height) / 2; + int x = (RGUI_WIDTH - width) / 2; + int y = (RGUI_HEIGHT - height) / 2; fill_rect(rgui->frame_buf, rgui->frame_buf_pitch, x + 5, y + 5, width - 10, height - 10, gray_filler); @@ -1637,35 +1639,7 @@ bool menu_iterate(void) g_extern.frame_count++; input_state = 0; - - driver.input->poll(NULL); - -#ifdef HAVE_OVERLAY - if (driver.overlay) - { - driver.overlay_state = 0; - - unsigned device = input_overlay_full_screen(driver.overlay) ? - RARCH_DEVICE_POINTER_SCREEN : RETRO_DEVICE_POINTER; - - bool polled = false; - for (unsigned i = 0; - input_input_state_func(NULL, 0, device, i, RETRO_DEVICE_ID_POINTER_PRESSED); - i++) - { - int16_t x = input_input_state_func(NULL, 0, - device, i, RETRO_DEVICE_ID_POINTER_X); - int16_t y = input_input_state_func(NULL, 0, - device, i, RETRO_DEVICE_ID_POINTER_Y); - - driver.overlay_state |= input_overlay_poll(driver.overlay, x, y); - polled = true; - } - - if (!polled) - input_overlay_poll_clear(driver.overlay); - } -#endif + rarch_input_poll(); #ifndef GEKKO /* TODO - not sure if correct regarding RARCH_QUIT_KEY */ @@ -1676,8 +1650,9 @@ bool menu_iterate(void) } #endif + // FIXME: Broken for PC atm. for (unsigned i = 0; i < RMENU_DEVICE_NAV_LAST; i++) - input_state |= driver.input->input_state(NULL, menu_nav_binds, 0, + input_state |= driver.input->input_state(driver.input_data, menu_nav_binds, 0, RETRO_DEVICE_JOYPAD, 0, i) ? (1ULL << i) : 0; input_state |= driver.input->key_pressed(driver.input_data, RARCH_MENU_TOGGLE) ? (1ULL << GX_DEVICE_NAV_MENU) : 0; diff --git a/frontend/menu/rgui.h b/frontend/menu/rgui.h index 8438785282..a1d3f70d2d 100644 --- a/frontend/menu/rgui.h +++ b/frontend/menu/rgui.h @@ -123,6 +123,10 @@ int rgui_iterate(rgui_handle_t *rgui, rgui_action_t action); void rgui_free(rgui_handle_t *rgui); +void menu_init(void); +bool menu_iterate(void); +void menu_free(void); + #ifdef __cplusplus } #endif diff --git a/general.h b/general.h index 913379d76b..ab101d1180 100644 --- a/general.h +++ b/general.h @@ -646,6 +646,7 @@ void rarch_main_deinit(void); void rarch_render_cached_frame(void); void rarch_init_msg_queue(void); void rarch_deinit_msg_queue(void); +void rarch_input_poll(void); void rarch_load_state(void); void rarch_save_state(void); diff --git a/retroarch.c b/retroarch.c index efb4779c60..b517a6003c 100644 --- a/retroarch.c +++ b/retroarch.c @@ -495,7 +495,7 @@ static inline void input_poll_overlay(void) } #endif -static void input_poll(void) +void rarch_input_poll(void) { input_poll_func(); @@ -1615,7 +1615,7 @@ static void init_libretro_cbs_plain(void) pretro_set_audio_sample(audio_sample); pretro_set_audio_sample_batch(audio_sample_batch); pretro_set_input_state(input_state); - pretro_set_input_poll(input_poll); + pretro_set_input_poll(rarch_input_poll); } static void init_libretro_cbs(void) @@ -2848,6 +2848,7 @@ error: return 1; } +#ifdef HAVE_RGUI static inline bool check_enter_rgui(void) { static bool old_rmenu_toggle = true; @@ -2868,6 +2869,7 @@ static inline bool check_enter_rgui(void) return false; } } +#endif bool rarch_main_iterate(void) { @@ -2891,8 +2893,10 @@ bool rarch_main_iterate(void) return false; } +#ifdef HAVE_RGUI if (check_enter_rgui()) return false; // Enter menu, don't exit. +#endif #ifdef HAVE_COMMAND if (driver.command) @@ -3069,7 +3073,7 @@ bool rarch_main_idle_iterate(void) return false; do_state_checks(); - input_poll(); + rarch_input_poll(); rarch_sleep(10); return true; }