diff --git a/driver.c b/driver.c index 965a0ceb5d..96fc0c2c73 100644 --- a/driver.c +++ b/driver.c @@ -168,6 +168,30 @@ static bool driver_find_first(const char *label, char *s, size_t len) return true; } +/** + * driver_find_last: + * @label : string of driver type to be found. + * @s : identifier of driver to be found. + * @len : size of @s. + * + * Find last driver in driver array. + **/ +static bool driver_find_last(const char *label, char *s, size_t len) +{ + unsigned i; + + for (i = 0; + find_driver_nonempty(label, i, s, len) != NULL; i++) + {} + + if (i) + find_driver_nonempty(label, i-1, s, len); + else + driver_find_first(label, s, len); + + return true; +} + /** * driver_find_prev: * @label : string of driver type to be found. @@ -475,6 +499,13 @@ bool driver_ctl(enum driver_ctl_state state, void *data) return false; return driver_find_first(drv->label, drv->s, drv->len); } + case RARCH_DRIVER_CTL_FIND_LAST: + { + driver_ctx_info_t *drv = (driver_ctx_info_t*)data; + if (!drv) + return false; + return driver_find_last(drv->label, drv->s, drv->len); + } case RARCH_DRIVER_CTL_FIND_PREV: { driver_ctx_info_t *drv = (driver_ctx_info_t*)data; diff --git a/driver.h b/driver.h index 753bd4905b..1120253e65 100644 --- a/driver.h +++ b/driver.h @@ -93,6 +93,8 @@ enum driver_ctl_state RARCH_DRIVER_CTL_FIND_FIRST, + RARCH_DRIVER_CTL_FIND_LAST, + RARCH_DRIVER_CTL_FIND_PREV, RARCH_DRIVER_CTL_FIND_NEXT, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index dc25cf1f0f..cff3ea5c4f 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -368,7 +368,17 @@ static int setting_string_action_left_driver(void *data, drv.len = setting->size; if (!driver_ctl(RARCH_DRIVER_CTL_FIND_PREV, &drv)) - return -1; + { + settings_t *settings = config_get_ptr(); + + if (settings && settings->bools.menu_navigation_wraparound_enable) + { + drv.label = setting->name; + drv.s = setting->value.target.string; + drv.len = setting->size; + driver_ctl(RARCH_DRIVER_CTL_FIND_LAST, &drv); + } + } if (setting->change_handler) setting->change_handler(setting);