diff --git a/driver.h b/driver.h index c494c34c9b..1e497505bd 100644 --- a/driver.h +++ b/driver.h @@ -331,6 +331,22 @@ typedef struct input_driver const rarch_joypad_driver_t *(*get_joypad_driver)(void *data); } input_driver_t; +typedef struct input_osk_driver +{ + void *(*init)(size_t size); + void (*free)(void *data); + bool (*enable_key_layout)(void *data); + void (*oskutil_create_activation_parameters)(void *data); + void (*write_msg)(void *data, const void *msg); + void (*write_initial_msg)(void *data, const void *msg); + bool (*start)(void *data); + void (*lifecycle)(void *data, uint64_t status); + bool (*cb_init)(void *data); + bool (*cb_callback)(void *data); + unsigned action; + const char *ident; +} input_osk_driver_t; + typedef struct camera_driver { // FIXME: params for init - queries for resolution, framerate, color format @@ -596,6 +612,7 @@ extern const input_driver_t input_qnx; extern const input_driver_t input_rwebinput; extern const input_driver_t input_null; extern const camera_driver_t camera_v4l2; +extern const input_osk_driver_t input_ps3_osk; #include "driver_funcs.h" diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index ceff527d24..e26f9eb364 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -33,6 +33,9 @@ rgui_handle_t *rgui; const menu_ctx_driver_t *menu_ctx; +#ifdef HAVE_OSK +input_osk_driver_t *osk; +#endif //forward decl static int menu_iterate_func(void *data, unsigned action); @@ -382,6 +385,36 @@ bool load_menu_game(void) } } +#ifdef HAVE_OSK +static const input_osk_driver_t *osk_drivers[] = { +#if defined(__CELLOS_LV2__) + &input_ps3_osk, +#endif + NULL // zero length array is not valid +}; + +static bool osk_init_first(void **data) +{ + unsigned i; + input_osk_driver_t **handle = (input_osk_driver_t**)data; + + if (!osk_drivers[0]) + return false; + + for (i = 0; osk_drivers[i]; i++) + { + void *h = osk_drivers[i]->init(0); + if (h) + { + *handle = (input_osk_driver_t*)h; + return true; + } + } + + return false; +} +#endif + void menu_init(void) { if (!menu_ctx_init_first(&menu_ctx, ((void**)&rgui))) @@ -412,8 +445,11 @@ void menu_init(void) #endif #ifdef HAVE_OSK - //FIXME - will go through a proper interface - rgui->oskutil_handle = (ps3_osk_t*)oskutil_init(0); + if (!osk_init_first(((void**)&osk))) + { + RARCH_ERR("Could not initialize OSK.\n"); + rarch_fail(1, "osk_init()"); + } #endif menu_init_history(); @@ -430,9 +466,8 @@ void menu_free(void) #endif #ifdef HAVE_OSK - //FIXME - will go through a proper interface - if (rgui->oskutil_handle) - oskutil_free(rgui->oskutil_handle); + if (osk) + osk->free(osk); #endif file_list_free(rgui->menu_stack); diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index 2012e3e134..df22495317 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -264,6 +264,7 @@ enum }; #endif + typedef struct { uint64_t old_input_state; @@ -308,12 +309,6 @@ typedef struct struct retro_system_info info; bool load_no_rom; -#ifdef HAVE_OSK - unsigned osk_param; - ps3_osk_t *oskutil_handle; - bool (*osk_init)(void *data); - bool (*osk_callback)(void *data); -#endif #ifdef HAVE_SHADER_MANAGER struct gfx_shader shader; #endif @@ -326,6 +321,9 @@ typedef struct } rgui_handle_t; extern rgui_handle_t *rgui; +#ifdef HAVE_OSK +extern input_osk_driver_t *osk; +#endif void menu_init(void); bool menu_iterate(void); diff --git a/frontend/platform/platform_ps3.c b/frontend/platform/platform_ps3.c index 35505c0e99..280a78bce8 100644 --- a/frontend/platform/platform_ps3.c +++ b/frontend/platform/platform_ps3.c @@ -154,7 +154,7 @@ static void callback_sysutil_exit(uint64_t status, uint64_t param, void *userdat case CELL_SYSUTIL_OSKDIALOG_INPUT_CANCELED: case CELL_SYSUTIL_OSKDIALOG_FINISHED: case CELL_SYSUTIL_OSKDIALOG_UNLOADED: - oskutil_lifecycle(rgui->oskutil_handle, status); + oskutil_lifecycle(osk, status); break; #endif } diff --git a/ps3/ps3_input.c b/ps3/ps3_input.c index 21e3c94531..32d4f0a6f7 100644 --- a/ps3/ps3_input.c +++ b/ps3/ps3_input.c @@ -248,7 +248,7 @@ static int16_t ps3_input_state(void *data, const struct retro_keybind **binds, #define OSK_IN_USE 1 -void *oskutil_init(unsigned containersize) +void *oskutil_init(size_t size) { ps3_osk_t *params = (ps3_osk_t*)calloc(1, sizeof(*params)); @@ -256,8 +256,8 @@ void *oskutil_init(unsigned containersize) return NULL; params->flags = 0; - if (containersize) - params->osk_memorycontainer = containersize; + if (size) + params->osk_memorycontainer = size; else params->osk_memorycontainer = 1024*1024*2; @@ -272,7 +272,7 @@ void oskutil_free(void *data) free(params); } -static bool oskutil_enable_key_layout (void *data) +static bool oskutil_enable_key_layout(void *data) { (void)data; @@ -389,6 +389,21 @@ void oskutil_lifecycle(void *data, uint64_t status) break; } } + +const input_osk_driver_t input_ps3_osk = { + oskutil_init, + oskutil_free, + oskutil_enable_key_layout, + oskutil_create_activation_parameters, + oskutil_write_message, + oskutil_write_initial_message, + oskutil_start, + oskutil_lifecycle, + NULL, + NULL, + 0, + "ps3osk" +}; #endif /*============================================================