Refactor prev/next driver settings

This commit is contained in:
twinaphex 2014-08-31 19:06:32 +02:00
parent d34e08fb76
commit a44665bcae
3 changed files with 75 additions and 88 deletions

129
driver.c
View File

@ -243,101 +243,100 @@ static const menu_ctx_driver_t *menu_ctx_drivers[] = {
};
#endif
static const void *find_driver_nonempty(unsigned cmd, int i,
static const void *find_driver_nonempty(const char *label, int i,
char *str, size_t sizeof_str)
{
const void *driver = NULL;
switch (cmd)
if (!strcmp(label, "camera_driver"))
{
case RARCH_DRIVER_LOCATION:
driver = location_drivers[i];
if (driver)
strlcpy(str, location_drivers[i]->ident, sizeof_str);
break;
case RARCH_DRIVER_CAMERA:
driver = camera_drivers[i];
if (driver)
strlcpy(str, camera_drivers[i]->ident, sizeof_str);
break;
case RARCH_DRIVER_OSK:
driver = osk_drivers[i];
if (driver)
strlcpy(str, osk_drivers[i]->ident, sizeof_str);
break;
driver = camera_drivers[i];
if (driver)
strlcpy(str, camera_drivers[i]->ident, sizeof_str);
}
else if (!strcmp(label, "location_driver"))
{
driver = location_drivers[i];
if (driver)
strlcpy(str, location_drivers[i]->ident, sizeof_str);
}
else if (!strcmp(label, "osk_driver"))
{
driver = osk_drivers[i];
if (driver)
strlcpy(str, osk_drivers[i]->ident, sizeof_str);
}
#ifdef HAVE_MENU
case RARCH_DRIVER_MENU:
driver = menu_ctx_drivers[i];
if (driver)
strlcpy(str, menu_ctx_drivers[i]->ident, sizeof_str);
break;
else if (!strcmp(label, "menu_driver"))
{
driver = menu_ctx_drivers[i];
if (driver)
strlcpy(str, menu_ctx_drivers[i]->ident, sizeof_str);
}
#endif
case RARCH_DRIVER_INPUT:
driver = input_drivers[i];
if (driver)
strlcpy(str, input_drivers[i]->ident, sizeof_str);
break;
case RARCH_DRIVER_VIDEO:
driver = video_drivers[i];
if (driver)
strlcpy(str, video_drivers[i]->ident, sizeof_str);
break;
case RARCH_DRIVER_AUDIO:
driver = audio_drivers[i];
if (driver)
strlcpy(str, audio_drivers[i]->ident, sizeof_str);
break;
else if (!strcmp(label, "input_driver"))
{
driver = input_drivers[i];
if (driver)
strlcpy(str, input_drivers[i]->ident, sizeof_str);
}
else if (!strcmp(label, "video_driver"))
{
driver = video_drivers[i];
if (driver)
strlcpy(str, video_drivers[i]->ident, sizeof_str);
}
else if (!strcmp(label, "audio_driver"))
{
driver = audio_drivers[i];
if (driver)
strlcpy(str, audio_drivers[i]->ident, sizeof_str);
}
return driver;
}
static int find_driver_index(unsigned cmd, const char *driver)
static int find_driver_index(const char * label, const char *driver)
{
unsigned i;
const void *obj = NULL;
switch (cmd)
char str[PATH_MAX];
for (i = 0; (obj = (const void*)find_driver_nonempty(label, i, str, sizeof(str))) != NULL; i++)
{
case RARCH_DRIVER_NONE:
break;
default:
{
char str[PATH_MAX];
for (i = 0; find_driver_nonempty(cmd, i, str, sizeof(str)) != NULL; i++)
{
if (str[0] == '\0')
break;
if (!strcasecmp(driver, str))
return i;
}
}
if (!obj)
return -1;
if (str[0] == '\0')
break;
if (!strcasecmp(driver, str))
return i;
}
return -1;
}
void find_prev_driver(unsigned cmd, char *str, size_t sizeof_str)
void find_prev_driver(const char *label, char *str, size_t sizeof_str)
{
int i = find_driver_index(cmd, str);
int i = find_driver_index(label, str);
if (i > 0)
find_driver_nonempty(cmd, i - 1, str, sizeof_str);
find_driver_nonempty(label, i - 1, str, sizeof_str);
else
RARCH_WARN("Couldn't find any previous driver (current one: \"%s\").\n", str);
}
void find_next_driver(unsigned cmd, char *str, size_t sizeof_str)
void find_next_driver(const char *label, char *str, size_t sizeof_str)
{
int i = find_driver_index(cmd, str);
int i = find_driver_index(label, str);
if (i >= 0)
find_driver_nonempty(cmd, i + 1, str, sizeof_str);
find_driver_nonempty(label, i + 1, str, sizeof_str);
else
RARCH_WARN("Couldn't find any next driver (current one: \"%s\").\n", str);
}
static void find_osk_driver(void)
{
int i = find_driver_index(RARCH_DRIVER_OSK, g_settings.osk.driver);
int i = find_driver_index("osk_driver", g_settings.osk.driver);
if (i >= 0)
driver.osk = osk_drivers[i];
else
@ -386,7 +385,7 @@ void uninit_osk(void)
static void find_camera_driver(void)
{
int i = find_driver_index(RARCH_DRIVER_CAMERA, g_settings.camera.driver);
int i = find_driver_index("camera_driver", g_settings.camera.driver);
if (i >= 0)
driver.camera = camera_drivers[i];
else
@ -474,7 +473,7 @@ void uninit_camera(void)
static void find_location_driver(void)
{
int i = find_driver_index(RARCH_DRIVER_LOCATION, g_settings.location.driver);
int i = find_driver_index("location_driver", g_settings.location.driver);
if (i >= 0)
driver.location = location_drivers[i];
else
@ -569,7 +568,7 @@ void uninit_location(void)
void find_menu_driver(void)
{
int i = find_driver_index(RARCH_DRIVER_MENU, g_settings.menu.driver);
int i = find_driver_index("menu_driver", g_settings.menu.driver);
if (i >= 0)
driver.menu_ctx = menu_ctx_drivers[i];
else
@ -592,7 +591,7 @@ void find_menu_driver(void)
static void find_audio_driver(void)
{
int i = find_driver_index(RARCH_DRIVER_AUDIO, g_settings.audio.driver);
int i = find_driver_index("audio_driver", g_settings.audio.driver);
if (i >= 0)
driver.audio = audio_drivers[i];
else
@ -623,7 +622,7 @@ static void find_video_driver(void)
}
#endif
int i = find_driver_index(RARCH_DRIVER_VIDEO, g_settings.video.driver);
int i = find_driver_index("video_driver", g_settings.video.driver);
if (i >= 0)
driver.video = video_drivers[i];
else
@ -645,7 +644,7 @@ static void find_video_driver(void)
static void find_input_driver(void)
{
int i = find_driver_index(RARCH_DRIVER_INPUT, g_settings.input.driver);
int i = find_driver_index("input_driver", g_settings.input.driver);
if (i >= 0)
driver.input = input_drivers[i];
else

View File

@ -119,18 +119,6 @@ enum // RetroArch specific bind IDs.
RARCH_BIND_LIST_END_NULL
};
enum
{
RARCH_DRIVER_NONE = 0,
RARCH_DRIVER_VIDEO,
RARCH_DRIVER_AUDIO,
RARCH_DRIVER_INPUT,
RARCH_DRIVER_CAMERA,
RARCH_DRIVER_OSK,
RARCH_DRIVER_LOCATION,
RARCH_DRIVER_MENU,
};
struct retro_keybind
{
bool valid;
@ -466,8 +454,8 @@ void uninit_video_input(void);
void init_audio(void);
void uninit_audio(void);
void find_prev_driver(unsigned cmd, char *str, size_t sizeof_str);
void find_next_driver(unsigned cmd, char *str, size_t sizeof_str);
void find_prev_driver(const char *label, char *str, size_t sizeof_str);
void find_next_driver(const char *label, char *str, size_t sizeof_str);
void find_prev_resampler_driver(void);
void find_next_resampler_driver(void);

View File

@ -805,16 +805,16 @@ void menu_common_setting_set_current_string(rarch_setting_t *setting, const char
setting->change_handler(setting);
}
static void handle_driver(unsigned id, char *driver, size_t sizeof_driver,
static void handle_driver(const char *label, char *driver, size_t sizeof_driver,
unsigned action)
{
switch (action)
{
case MENU_ACTION_LEFT:
find_prev_driver(id, driver, sizeof_driver);
find_prev_driver(label, driver, sizeof_driver);
break;
case MENU_ACTION_RIGHT:
find_next_driver(id, driver, sizeof_driver);
find_next_driver(label, driver, sizeof_driver);
break;
}
}
@ -867,10 +867,10 @@ static void handle_setting(rarch_setting_t *setting,
}
#endif
if (!strcmp(setting->name, "video_driver"))
handle_driver(RARCH_DRIVER_VIDEO, g_settings.video.driver,
handle_driver(setting->name, g_settings.video.driver,
sizeof(g_settings.video.driver), action);
else if (!strcmp(setting->name, "audio_driver"))
handle_driver(RARCH_DRIVER_AUDIO, g_settings.audio.driver,
handle_driver(setting->name, g_settings.audio.driver,
sizeof(g_settings.audio.driver), action);
else if (!strcmp(setting->name, "audio_resampler_driver"))
{
@ -880,16 +880,16 @@ static void handle_setting(rarch_setting_t *setting,
find_next_resampler_driver();
}
else if (!strcmp(setting->name, "input_driver"))
handle_driver(RARCH_DRIVER_INPUT, g_settings.input.driver,
handle_driver(setting->name, g_settings.input.driver,
sizeof(g_settings.input.driver), action);
else if (!strcmp(setting->name, "camera_driver"))
handle_driver(RARCH_DRIVER_CAMERA, g_settings.camera.driver,
handle_driver(setting->name, g_settings.camera.driver,
sizeof(g_settings.camera.driver), action);
else if (!strcmp(setting->name, "location_driver"))
handle_driver(RARCH_DRIVER_LOCATION, g_settings.location.driver,
handle_driver(setting->name, g_settings.location.driver,
sizeof(g_settings.location.driver), action);
else if (!strcmp(setting->name, "menu_driver"))
handle_driver(RARCH_DRIVER_MENU, g_settings.menu.driver,
handle_driver(setting->name, g_settings.menu.driver,
sizeof(g_settings.menu.driver), action);
}
}