diff --git a/Makefile.ps3 b/Makefile.ps3 index f218158865..8d2a1cc0f6 100644 --- a/Makefile.ps3 +++ b/Makefile.ps3 @@ -111,7 +111,7 @@ PPU_LDLIBS = $(FONT_LIBS) $(GL_LIBS) $(WHOLE_START) -lretro_ps3 $(WHOLE_END) -l PPU_RANLIB = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ranlib.exe -DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_VID_CONTEXT -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_FBO -DHAVE_RARCH_MAIN_WRAP -DHAVE_RARCH_MAIN_IMPLEMENTATION -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_LIBRETRO_MANAGEMENT -DHAVE_RSOUND -DHAVE_ZLIB -DWANT_MINIZ -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETPLAY=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_OSKUTIL -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) +DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_VID_CONTEXT -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_FBO -DHAVE_RARCH_MAIN_WRAP -DHAVE_RARCH_MAIN_IMPLEMENTATION -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_LIBRETRO_MANAGEMENT -DHAVE_RSOUND -DHAVE_ZLIB -DWANT_MINIZ -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETPLAY=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_OSK -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) ifeq ($(DEBUG), 1) PPU_OPTIMIZE_LV := -O0 -g diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index 3f2f31fd25..ceff527d24 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -411,6 +411,11 @@ void menu_init(void) shader_manager_init(rgui); #endif +#ifdef HAVE_OSK + //FIXME - will go through a proper interface + rgui->oskutil_handle = (ps3_osk_t*)oskutil_init(0); +#endif + menu_init_history(); rgui->last_time = rarch_get_time_usec(); } @@ -424,6 +429,12 @@ void menu_free(void) libretro_free_system_info(&rgui->info); #endif +#ifdef HAVE_OSK + //FIXME - will go through a proper interface + if (rgui->oskutil_handle) + oskutil_free(rgui->oskutil_handle); +#endif + file_list_free(rgui->menu_stack); file_list_free(rgui->selection_buf); diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index e8bcabd06b..2012e3e134 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -308,9 +308,9 @@ typedef struct struct retro_system_info info; bool load_no_rom; -#ifdef HAVE_OSKUTIL +#ifdef HAVE_OSK unsigned osk_param; - oskutil_params oskutil_handle; + ps3_osk_t *oskutil_handle; bool (*osk_init)(void *data); bool (*osk_callback)(void *data); #endif diff --git a/frontend/menu/rmenu.c b/frontend/menu/rmenu.c index e2ca112b1f..516a1540d8 100644 --- a/frontend/menu/rmenu.c +++ b/frontend/menu/rmenu.c @@ -1204,7 +1204,7 @@ static void set_keybind_digital(unsigned default_retro_joypad_id, uint64_t actio default_retro_joypad_id, keybind_action); } -#if defined(HAVE_OSKUTIL) +#if defined(HAVE_OSK) #ifdef __CELLOS_LV2__ static bool osk_callback_enter_rsound(void *data) @@ -1486,7 +1486,7 @@ static int set_setting_action(void *data, uint8_t menu_type, unsigned switchvalu case RGUI_ACTION_LEFT: case RGUI_ACTION_RIGHT: case RGUI_ACTION_OK: -#ifdef HAVE_OSKUTIL +#ifdef HAVE_OSK rgui->osk_init = osk_callback_enter_rsound_init; rgui->osk_callback = osk_callback_enter_rsound; #endif @@ -1751,7 +1751,7 @@ static int set_setting_action(void *data, uint8_t menu_type, unsigned switchvalu } break; case SHADERMAN_SAVE_CGP: -#ifdef HAVE_OSKUTIL +#ifdef HAVE_OSK switch (action) { case RGUI_ACTION_OK: @@ -2157,7 +2157,7 @@ int rmenu_iterate(void *data, unsigned action) rgui->need_refresh = false; } -#ifdef HAVE_OSKUTIL +#ifdef HAVE_OSK if (rgui->osk_init != NULL) { if (rgui->osk_init(rgui)) @@ -2241,7 +2241,7 @@ static void* rmenu_init(void) rgui_init_textures(rgui); -#ifdef HAVE_OSKUTIL +#ifdef HAVE_OSK oskutil_params *osk = &rgui->oskutil_handle; oskutil_init(osk, 0); #endif diff --git a/frontend/platform/platform_ps3.c b/frontend/platform/platform_ps3.c index 4b57aafffb..3afb742f58 100644 --- a/frontend/platform/platform_ps3.c +++ b/frontend/platform/platform_ps3.c @@ -141,9 +141,6 @@ static void callback_sysutil_exit(uint64_t status, uint64_t param, void *userdat (void)status; #ifndef IS_SALAMANDER -#ifdef HAVE_OSKUTIL - oskutil_params *osk = &rgui->oskutil_handle; -#endif gl_t *gl = driver.video_data; switch (status) @@ -152,34 +149,12 @@ static void callback_sysutil_exit(uint64_t status, uint64_t param, void *userdat gl->quitting = true; g_extern.lifecycle_state &= ~((1ULL << MODE_MENU) | (1ULL << MODE_GAME)); break; -#ifdef HAVE_OSKUTIL +#ifdef HAVE_OSK case CELL_SYSUTIL_OSKDIALOG_LOADED: - break; case CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED: - RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED.\n"); - pOskAbort(); //fall-through case CELL_SYSUTIL_OSKDIALOG_FINISHED: - if (status == CELL_SYSUTIL_OSKDIALOG_FINISHED) - RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_FINISHED.\n"); - - pOskUnloadAsync(&osk->outputInfo); - - if (osk->outputInfo.result == CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK) - { - RARCH_LOG("Setting MODE_OSK_ENTRY_SUCCESS.\n"); - g_extern.lifecycle_state |= (1ULL << MODE_OSK_ENTRY_SUCCESS); - } - else - { - RARCH_LOG("Setting MODE_OSK_ENTRY_FAIL.\n"); - g_extern.lifecycle_state |= (1ULL << MODE_OSK_ENTRY_FAIL); - } - - osk->flags &= ~OSK_IN_USE; - break; case CELL_SYSUTIL_OSKDIALOG_UNLOADED: - RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_UNLOADED.\n"); - sys_memory_container_destroy(osk->containerid); + oskutil_lifecycle(rgui->oskutil_handle, status); break; #endif } diff --git a/ps3/ps3_input.c b/ps3/ps3_input.c index 295f6c298b..21e3c94531 100644 --- a/ps3/ps3_input.c +++ b/ps3/ps3_input.c @@ -244,31 +244,47 @@ static int16_t ps3_input_state(void *data, const struct retro_keybind **binds, ON-SCREEN KEYBOARD UTILITY ============================================================ */ -#ifdef HAVE_OSKUTIL +#ifdef HAVE_OSK #define OSK_IN_USE 1 -void oskutil_init(oskutil_params *params, unsigned containersize) +void *oskutil_init(unsigned containersize) { + ps3_osk_t *params = (ps3_osk_t*)calloc(1, sizeof(*params)); + + if (!params) + return NULL; + params->flags = 0; if (containersize) params->osk_memorycontainer = containersize; else params->osk_memorycontainer = 1024*1024*2; + + return params; } -static bool oskutil_enable_key_layout (void) +void oskutil_free(void *data) { - int ret = pOskSetKeyLayoutOption(CELL_OSKDIALOG_10KEY_PANEL | \ - CELL_OSKDIALOG_FULLKEY_PANEL); - if (ret < 0) - return (false); - else - return (true); + ps3_osk_t *params = (ps3_osk_t*)data; + + if (params) + free(params); } -static void oskutil_create_activation_parameters(oskutil_params *params) +static bool oskutil_enable_key_layout (void *data) { + (void)data; + + if (pOskSetKeyLayoutOption(CELL_OSKDIALOG_10KEY_PANEL | CELL_OSKDIALOG_FULLKEY_PANEL) < 0) + return false; + + return true; +} + +static void oskutil_create_activation_parameters(void *data) +{ + ps3_osk_t *params = (ps3_osk_t*)data; params->dialogParam.controlPoint.x = 0.0; params->dialogParam.controlPoint.y = 0.0; @@ -285,29 +301,31 @@ static void oskutil_create_activation_parameters(oskutil_params *params) params->dialogParam.osk_prohibit_flags = 0; } -void oskutil_write_message(oskutil_params *params, const wchar_t* msg) +void oskutil_write_message(void *data, const void *data_msg) { + ps3_osk_t *params = (ps3_osk_t*)data; + const wchar_t *msg = (const wchar_t*)data_msg; params->inputFieldInfo.osk_inputfield_message = (uint16_t*)msg; } -void oskutil_write_initial_message(oskutil_params *params, const wchar_t* msg) +void oskutil_write_initial_message(void *data, const void *data_msg) { + ps3_osk_t *params = (ps3_osk_t*)data; + const wchar_t *msg = (const wchar_t*)data_msg; params->inputFieldInfo.osk_inputfield_starttext = (uint16_t*)msg; } -bool oskutil_start(oskutil_params *params) +bool oskutil_start(void *data) { + ps3_osk_t *params = (ps3_osk_t*)data; + if (params->flags & OSK_IN_USE) { RARCH_WARN("OSK util already initialized and in use\n"); return true; } - int ret = 0; - - ret = sys_memory_container_create(¶ms->containerid, params->osk_memorycontainer); - - if (ret < 0) + if (sys_memory_container_create(¶ms->containerid, params->osk_memorycontainer) < 0) goto do_deinit; params->outputInfo.osk_callback_return_param = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK; @@ -320,12 +338,10 @@ bool oskutil_start(oskutil_params *params) oskutil_create_activation_parameters(params); - if (!oskutil_enable_key_layout()) + if (!oskutil_enable_key_layout(params)) return (false); - ret = pOskLoadAsync(params->containerid, ¶ms->dialogParam, ¶ms->inputFieldInfo); - - if (ret < 0) + if (pOskLoadAsync(params->containerid, ¶ms->dialogParam, ¶ms->inputFieldInfo) < 0) goto do_deinit; params->flags |= OSK_IN_USE; @@ -336,6 +352,43 @@ do_deinit: RARCH_ERR("Could not properly initialize OSK util.\n"); return false; } + +void oskutil_lifecycle(void *data, uint64_t status) +{ + ps3_osk_t *osk = (ps3_osk_t*)data; + + switch (status) + { + case CELL_SYSUTIL_OSKDIALOG_LOADED: + break; + case CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED: + RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED.\n"); + pOskAbort(); //fall-through + case CELL_SYSUTIL_OSKDIALOG_FINISHED: + if (status == CELL_SYSUTIL_OSKDIALOG_FINISHED) + RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_FINISHED.\n"); + + pOskUnloadAsync(&osk->outputInfo); + + if (osk->outputInfo.result == CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK) + { + RARCH_LOG("Setting MODE_OSK_ENTRY_SUCCESS.\n"); + g_extern.lifecycle_state |= (1ULL << MODE_OSK_ENTRY_SUCCESS); + } + else + { + RARCH_LOG("Setting MODE_OSK_ENTRY_FAIL.\n"); + g_extern.lifecycle_state |= (1ULL << MODE_OSK_ENTRY_FAIL); + } + + osk->flags &= ~OSK_IN_USE; + break; + case CELL_SYSUTIL_OSKDIALOG_UNLOADED: + RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_UNLOADED.\n"); + sys_memory_container_destroy(osk->containerid); + break; + } +} #endif /*============================================================ diff --git a/ps3/ps3_input.h b/ps3/ps3_input.h index 48ea0e5428..d8c9232466 100644 --- a/ps3/ps3_input.h +++ b/ps3/ps3_input.h @@ -29,9 +29,8 @@ #define DEADZONE_LOW 55 #define DEADZONE_HIGH 210 -#ifdef HAVE_OSKUTIL - -typedef struct +#ifdef HAVE_OSK +typedef struct ps3_osk { unsigned int osk_memorycontainer; wchar_t init_message[CELL_OSKDIALOG_STRING_SIZE + 1]; @@ -43,12 +42,12 @@ typedef struct CellOskDialogInputFieldInfo inputFieldInfo; CellOskDialogCallbackReturnParam outputInfo; CellOskDialogParam dialogParam; -} oskutil_params; - -void oskutil_write_message(oskutil_params *params, const wchar_t* msg); -void oskutil_write_initial_message(oskutil_params *params, const wchar_t* msg); -void oskutil_init(oskutil_params *params, unsigned containersize); +} ps3_osk_t; +void oskutil_write_message(void *params, const void* msg); +void oskutil_write_initial_message(void *params, const void* msg); +void *oskutil_init(unsigned containersize); +void oskutil_free(void *data); #endif #endif diff --git a/ps3/sdk_defines.h b/ps3/sdk_defines.h index 1e51346f4a..616a05512e 100644 --- a/ps3/sdk_defines.h +++ b/ps3/sdk_defines.h @@ -143,7 +143,7 @@ extern int audioAddData(uint32_t portNum, float *data, uint32_t frames, float vo OSK PROTOTYPES ============================================================ */ -#ifdef HAVE_OSKUTIL +#ifdef HAVE_OSK #ifdef __PSL1GHT__ #include