1
0
mirror of https://github.com/libretro/RetroArch synced 2025-03-30 07:20:36 +00:00

(OSK) Refactor - (Onscreen Keyboard) - PS3-only backend for now -

I will make an overlay-based backend soon too for all other platforms
This commit is contained in:
twinaphex 2013-11-13 00:27:31 +01:00
parent b20360948f
commit aec049c803
8 changed files with 165 additions and 7 deletions

@ -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__)

108
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;

@ -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;

@ -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)

@ -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
}

@ -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);

@ -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

@ -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));