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:
parent
b20360948f
commit
aec049c803
@ -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
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;
|
||||
|
10
driver.h
10
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;
|
||||
|
@ -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
|
||||
}
|
||||
|
16
general.h
16
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);
|
||||
|
@ -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
|
||||
|
21
settings.c
21
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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user