(PS3) Refactor OSK code - next thing should be abstracting it

This commit is contained in:
twinaphex 2013-11-11 16:58:12 +01:00
parent 6a9bc1bfa4
commit fde4311ef5
8 changed files with 104 additions and 66 deletions

View File

@ -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 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) ifeq ($(DEBUG), 1)
PPU_OPTIMIZE_LV := -O0 -g PPU_OPTIMIZE_LV := -O0 -g

View File

@ -411,6 +411,11 @@ void menu_init(void)
shader_manager_init(rgui); shader_manager_init(rgui);
#endif #endif
#ifdef HAVE_OSK
//FIXME - will go through a proper interface
rgui->oskutil_handle = (ps3_osk_t*)oskutil_init(0);
#endif
menu_init_history(); menu_init_history();
rgui->last_time = rarch_get_time_usec(); rgui->last_time = rarch_get_time_usec();
} }
@ -424,6 +429,12 @@ void menu_free(void)
libretro_free_system_info(&rgui->info); libretro_free_system_info(&rgui->info);
#endif #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->menu_stack);
file_list_free(rgui->selection_buf); file_list_free(rgui->selection_buf);

View File

@ -308,9 +308,9 @@ typedef struct
struct retro_system_info info; struct retro_system_info info;
bool load_no_rom; bool load_no_rom;
#ifdef HAVE_OSKUTIL #ifdef HAVE_OSK
unsigned osk_param; unsigned osk_param;
oskutil_params oskutil_handle; ps3_osk_t *oskutil_handle;
bool (*osk_init)(void *data); bool (*osk_init)(void *data);
bool (*osk_callback)(void *data); bool (*osk_callback)(void *data);
#endif #endif

View File

@ -1204,7 +1204,7 @@ static void set_keybind_digital(unsigned default_retro_joypad_id, uint64_t actio
default_retro_joypad_id, keybind_action); default_retro_joypad_id, keybind_action);
} }
#if defined(HAVE_OSKUTIL) #if defined(HAVE_OSK)
#ifdef __CELLOS_LV2__ #ifdef __CELLOS_LV2__
static bool osk_callback_enter_rsound(void *data) 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_LEFT:
case RGUI_ACTION_RIGHT: case RGUI_ACTION_RIGHT:
case RGUI_ACTION_OK: case RGUI_ACTION_OK:
#ifdef HAVE_OSKUTIL #ifdef HAVE_OSK
rgui->osk_init = osk_callback_enter_rsound_init; rgui->osk_init = osk_callback_enter_rsound_init;
rgui->osk_callback = osk_callback_enter_rsound; rgui->osk_callback = osk_callback_enter_rsound;
#endif #endif
@ -1751,7 +1751,7 @@ static int set_setting_action(void *data, uint8_t menu_type, unsigned switchvalu
} }
break; break;
case SHADERMAN_SAVE_CGP: case SHADERMAN_SAVE_CGP:
#ifdef HAVE_OSKUTIL #ifdef HAVE_OSK
switch (action) switch (action)
{ {
case RGUI_ACTION_OK: case RGUI_ACTION_OK:
@ -2157,7 +2157,7 @@ int rmenu_iterate(void *data, unsigned action)
rgui->need_refresh = false; rgui->need_refresh = false;
} }
#ifdef HAVE_OSKUTIL #ifdef HAVE_OSK
if (rgui->osk_init != NULL) if (rgui->osk_init != NULL)
{ {
if (rgui->osk_init(rgui)) if (rgui->osk_init(rgui))
@ -2241,7 +2241,7 @@ static void* rmenu_init(void)
rgui_init_textures(rgui); rgui_init_textures(rgui);
#ifdef HAVE_OSKUTIL #ifdef HAVE_OSK
oskutil_params *osk = &rgui->oskutil_handle; oskutil_params *osk = &rgui->oskutil_handle;
oskutil_init(osk, 0); oskutil_init(osk, 0);
#endif #endif

View File

@ -141,9 +141,6 @@ static void callback_sysutil_exit(uint64_t status, uint64_t param, void *userdat
(void)status; (void)status;
#ifndef IS_SALAMANDER #ifndef IS_SALAMANDER
#ifdef HAVE_OSKUTIL
oskutil_params *osk = &rgui->oskutil_handle;
#endif
gl_t *gl = driver.video_data; gl_t *gl = driver.video_data;
switch (status) switch (status)
@ -152,34 +149,12 @@ static void callback_sysutil_exit(uint64_t status, uint64_t param, void *userdat
gl->quitting = true; gl->quitting = true;
g_extern.lifecycle_state &= ~((1ULL << MODE_MENU) | (1ULL << MODE_GAME)); g_extern.lifecycle_state &= ~((1ULL << MODE_MENU) | (1ULL << MODE_GAME));
break; break;
#ifdef HAVE_OSKUTIL #ifdef HAVE_OSK
case CELL_SYSUTIL_OSKDIALOG_LOADED: case CELL_SYSUTIL_OSKDIALOG_LOADED:
break;
case CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED: case CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED:
RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED.\n");
pOskAbort(); //fall-through
case CELL_SYSUTIL_OSKDIALOG_FINISHED: 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: case CELL_SYSUTIL_OSKDIALOG_UNLOADED:
RARCH_LOG("CELL_SYSUTIL_OSKDIALOG_UNLOADED.\n"); oskutil_lifecycle(rgui->oskutil_handle, status);
sys_memory_container_destroy(osk->containerid);
break; break;
#endif #endif
} }

View File

@ -244,31 +244,47 @@ static int16_t ps3_input_state(void *data, const struct retro_keybind **binds,
ON-SCREEN KEYBOARD UTILITY ON-SCREEN KEYBOARD UTILITY
============================================================ */ ============================================================ */
#ifdef HAVE_OSKUTIL #ifdef HAVE_OSK
#define OSK_IN_USE 1 #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; params->flags = 0;
if (containersize) if (containersize)
params->osk_memorycontainer = containersize; params->osk_memorycontainer = containersize;
else else
params->osk_memorycontainer = 1024*1024*2; 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 | \ ps3_osk_t *params = (ps3_osk_t*)data;
CELL_OSKDIALOG_FULLKEY_PANEL);
if (ret < 0) if (params)
return (false); free(params);
else
return (true);
} }
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.x = 0.0;
params->dialogParam.controlPoint.y = 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; 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; 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; 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) if (params->flags & OSK_IN_USE)
{ {
RARCH_WARN("OSK util already initialized and in use\n"); RARCH_WARN("OSK util already initialized and in use\n");
return true; return true;
} }
int ret = 0; if (sys_memory_container_create(&params->containerid, params->osk_memorycontainer) < 0)
ret = sys_memory_container_create(&params->containerid, params->osk_memorycontainer);
if (ret < 0)
goto do_deinit; goto do_deinit;
params->outputInfo.osk_callback_return_param = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK; 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); oskutil_create_activation_parameters(params);
if (!oskutil_enable_key_layout()) if (!oskutil_enable_key_layout(params))
return (false); return (false);
ret = pOskLoadAsync(params->containerid, &params->dialogParam, &params->inputFieldInfo); if (pOskLoadAsync(params->containerid, &params->dialogParam, &params->inputFieldInfo) < 0)
if (ret < 0)
goto do_deinit; goto do_deinit;
params->flags |= OSK_IN_USE; params->flags |= OSK_IN_USE;
@ -336,6 +352,43 @@ do_deinit:
RARCH_ERR("Could not properly initialize OSK util.\n"); RARCH_ERR("Could not properly initialize OSK util.\n");
return false; 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 #endif
/*============================================================ /*============================================================

View File

@ -29,9 +29,8 @@
#define DEADZONE_LOW 55 #define DEADZONE_LOW 55
#define DEADZONE_HIGH 210 #define DEADZONE_HIGH 210
#ifdef HAVE_OSKUTIL #ifdef HAVE_OSK
typedef struct ps3_osk
typedef struct
{ {
unsigned int osk_memorycontainer; unsigned int osk_memorycontainer;
wchar_t init_message[CELL_OSKDIALOG_STRING_SIZE + 1]; wchar_t init_message[CELL_OSKDIALOG_STRING_SIZE + 1];
@ -43,12 +42,12 @@ typedef struct
CellOskDialogInputFieldInfo inputFieldInfo; CellOskDialogInputFieldInfo inputFieldInfo;
CellOskDialogCallbackReturnParam outputInfo; CellOskDialogCallbackReturnParam outputInfo;
CellOskDialogParam dialogParam; CellOskDialogParam dialogParam;
} oskutil_params; } ps3_osk_t;
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);
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
#endif #endif

View File

@ -143,7 +143,7 @@ extern int audioAddData(uint32_t portNum, float *data, uint32_t frames, float vo
OSK PROTOTYPES OSK PROTOTYPES
============================================================ */ ============================================================ */
#ifdef HAVE_OSKUTIL #ifdef HAVE_OSK
#ifdef __PSL1GHT__ #ifdef __PSL1GHT__
#include <sysutil/osk.h> #include <sysutil/osk.h>