diff --git a/config.def.h b/config.def.h index 4d731e481a..44a57e3e11 100644 --- a/config.def.h +++ b/config.def.h @@ -83,6 +83,9 @@ enum CAMERA_V4L2, CAMERA_NULL, + + OSK_PS3, + OSK_NULL, }; #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) || defined(__CELLOS_LV2__) @@ -187,6 +190,12 @@ enum #define CAMERA_DEFAULT_DRIVER CAMERA_NULL #endif +#if defined(__CELLOS_LV2__) +#define OSK_DEFAULT_DRIVER OSK_PS3 +#else +#define OSK_DEFAULT_DRIVER OSK_NULL +#endif + #if defined(XENON) || defined(_XBOX360) || defined(__CELLOS_LV2__) #define DEFAULT_ASPECT_RATIO 1.7778f #elif defined(_XBOX1) || defined(GEKKO) || defined(ANDROID) || defined(__BLACKBERRY_QNX__) diff --git a/driver.c b/driver.c index ce624bd5a6..dd34f8a815 100644 --- a/driver.c +++ b/driver.c @@ -179,6 +179,59 @@ static const input_driver_t *input_drivers[] = { NULL, }; +#ifdef HAVE_OSK +static const input_osk_driver_t *osk_drivers[] = { +#ifdef __CELLOS_LV2__ + &input_ps3_osk, +#endif + NULL, +}; + +static int find_osk_driver_index(const char *driver) +{ + unsigned i; + for (i = 0; osk_drivers[i]; i++) + if (strcasecmp(driver, osk_drivers[i]->ident) == 0) + return i; + return -1; +} + +static void find_osk_driver(void) +{ + int i = find_osk_driver_index(g_settings.osk.driver); + if (i >= 0) + driver.osk = osk_drivers[i]; + else + { + unsigned d; + RARCH_ERR("Couldn't find any OSK driver named \"%s\"\n", g_settings.osk.driver); + RARCH_LOG_OUTPUT("Available OSK drivers are:\n"); + for (d = 0; osk_drivers[d]; d++) + RARCH_LOG_OUTPUT("\t%s\n", osk_drivers[d]->ident); + + rarch_fail(1, "find_osk_driver()"); + } +} + +void find_prev_osk_driver(void) +{ + int i = find_osk_driver_index(g_settings.osk.driver); + if (i > 0) + strlcpy(g_settings.osk.driver, osk_drivers[i - 1]->ident, sizeof(g_settings.osk.driver)); + else + RARCH_WARN("Couldn't find any previous osk driver (current one: \"%s\").\n", g_settings.osk.driver); +} + +void find_next_osk_driver(void) +{ + int i = find_osk_driver_index(g_settings.osk.driver); + if (i >= 0 && osk_drivers[i + 1]) + strlcpy(g_settings.osk.driver, osk_drivers[i + 1]->ident, sizeof(g_settings.osk.driver)); + else + RARCH_WARN("Couldn't find any next osk driver (current one: \"%s\").\n", g_settings.osk.driver); +} +#endif + #ifdef HAVE_CAMERA static const camera_driver_t *camera_drivers[] = { #ifdef HAVE_V4L2 @@ -383,6 +436,9 @@ void init_drivers_pre(void) #ifdef HAVE_CAMERA find_camera_driver(); #endif +#ifdef HAVE_OSK + find_osk_driver(); +#endif } static void adjust_system_rates(void) @@ -558,6 +614,14 @@ void global_uninit_drivers(void) driver.camera_data = NULL; } #endif + +#ifdef HAVE_OSK + if (driver.osk && driver.osk_data) + { + driver.osk->free(driver.osk_data); + driver.osk_data = NULL; + } +#endif } #ifdef HAVE_CAMERA @@ -583,6 +647,26 @@ void init_camera(void) } #endif +#ifdef HAVE_OSK +void init_osk(void) +{ + // Resource leaks will follow if osk is initialized twice. + if (driver.osk_data) + return; + + find_osk_driver(); + + //FIXME - refactor params later based on semantics + driver.osk_data = osk_init_func(0); + + if (!driver.osk_data) + { + RARCH_ERR("Failed to initialize OSK driver. Will continue without OSK.\n"); + g_extern.osk_active = false; + } +} +#endif + void init_drivers(void) { driver.video_data_own = !driver.video_data; @@ -591,6 +675,9 @@ void init_drivers(void) #ifdef HAVE_CAMERA driver.camera_data_own = !driver.camera_data; #endif +#ifdef HAVE_OSK + driver.osk_data_own = !driver.osk_data; +#endif adjust_system_rates(); @@ -609,6 +696,10 @@ void init_drivers(void) init_camera(); #endif +#ifdef HAVE_OSK + init_osk(); +#endif + // Keep non-throttled state as good as possible. if (driver.nonblock_state) driver_set_nonblock_state(driver.nonblock_state); @@ -624,6 +715,14 @@ void uninit_camera(void) } #endif +#ifdef HAVE_OSK +void uninit_osk(void) +{ + if (driver.osk_data && driver.osk) + driver.osk->free(driver.osk_data); +} +#endif + void uninit_drivers(void) { uninit_audio(); @@ -638,6 +737,12 @@ void uninit_drivers(void) if (driver.camera_data_own) driver.camera_data = NULL; +#endif +#ifdef HAVE_OSK + uninit_osk(); + + if (driver.osk_data_own) + driver.osk_data = NULL; #endif if (driver.video_data_own) driver.video_data = NULL; @@ -648,6 +753,9 @@ void uninit_drivers(void) #ifdef HAVE_CAMERA driver.camera_data_own = false; +#endif +#ifdef HAVE_OSK + driver.osk_data_own = false; #endif driver.video_data_own = false; driver.audio_data_own = false; diff --git a/driver.h b/driver.h index 1e497505bd..8927ff5396 100644 --- a/driver.h +++ b/driver.h @@ -341,9 +341,6 @@ typedef struct input_osk_driver 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; @@ -452,6 +449,10 @@ typedef struct driver const audio_driver_t *audio; const video_driver_t *video; const input_driver_t *input; +#ifdef HAVE_OSK + const input_osk_driver_t *osk; + void *osk_data; +#endif #ifdef HAVE_CAMERA const camera_driver_t *camera; void *camera_data; @@ -480,6 +481,9 @@ typedef struct driver #ifdef HAVE_CAMERA bool camera_data_own; #endif +#ifdef HAVE_OSK + bool osk_data_own; +#endif #ifdef HAVE_COMMAND rarch_cmd_t *command; diff --git a/driver_funcs.h b/driver_funcs.h index 567d5c150d..3d8ea016fe 100644 --- a/driver_funcs.h +++ b/driver_funcs.h @@ -20,6 +20,8 @@ #define camera_init_func(device, caps, width, height) driver.camera->init(device, caps, width, height) +#define osk_init_func(unknown) driver.osk->init(unknown) + #define audio_init_func(device, rate, latency) driver.audio->init(device, rate, latency) #define audio_write_func(buf, size) driver.audio->write(driver.audio_data, buf, size) #define audio_stop_func() driver.audio->stop(driver.audio_data) diff --git a/frontend/platform/platform_ps3.c b/frontend/platform/platform_ps3.c index 280a78bce8..debc16e72d 100644 --- a/frontend/platform/platform_ps3.c +++ b/frontend/platform/platform_ps3.c @@ -154,7 +154,8 @@ 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(osk, status); + if (driver.osk && driver.osk_data) + driver.osk->lifecycle(driver.osk_data, status); break; #endif } diff --git a/general.h b/general.h index 4d8b24f510..37eae77379 100644 --- a/general.h +++ b/general.h @@ -195,6 +195,16 @@ struct settings } camera; #endif +#ifdef HAVE_OSK + struct + { + char driver[32]; + uint64_t state; + bool (*cb_init)(void *data); + bool (*cb_callback)(void *data); + } osk; +#endif + struct { char driver[32]; @@ -321,6 +331,9 @@ struct global bool video_active; #ifdef HAVE_CAMERA bool camera_active; +#endif +#ifdef HAVE_OSK + bool osk_active; #endif bool force_fullscreen; @@ -638,6 +651,9 @@ void config_set_defaults(void); #ifdef HAVE_CAMERA const char *config_get_default_camera(void); #endif +#ifdef HAVE_OSK +const char *config_get_default_osk(void); +#endif const char *config_get_default_video(void); const char *config_get_default_audio(void); const char *config_get_default_input(void); diff --git a/ps3/ps3_input.c b/ps3/ps3_input.c index 32d4f0a6f7..bbf8b5ccde 100644 --- a/ps3/ps3_input.c +++ b/ps3/ps3_input.c @@ -399,9 +399,6 @@ const input_osk_driver_t input_ps3_osk = { oskutil_write_initial_message, oskutil_start, oskutil_lifecycle, - NULL, - NULL, - 0, "ps3osk" }; #endif diff --git a/settings.c b/settings.c index ced3899fe0..05714cb4b8 100644 --- a/settings.c +++ b/settings.c @@ -148,6 +148,21 @@ const char *config_get_default_input(void) } } +#ifdef HAVE_OSK +const char *config_get_default_osk(void) +{ + switch (OSK_DEFAULT_DRIVER) + { + case OSK_PS3: + return "ps3osk"; + case OSK_NULL: + return "null"; + default: + return NULL; + } +} +#endif + #ifdef HAVE_CAMERA const char *config_get_default_camera(void) { @@ -174,6 +189,12 @@ void config_set_defaults(void) if (def_camera) strlcpy(g_settings.camera.driver, def_camera, sizeof(g_settings.camera.driver)); +#endif +#ifdef HAVE_OSK + const char *def_osk = config_get_default_osk(); + + if (def_osk) + strlcpy(g_settings.osk.driver, def_osk, sizeof(g_settings.osk.driver)); #endif if (def_video) strlcpy(g_settings.video.driver, def_video, sizeof(g_settings.video.driver));