diff --git a/frontend/menu/backend/menu_backend.h b/frontend/menu/backend/menu_backend.h index d5cb6cc38a..1bf1f7fd7a 100644 --- a/frontend/menu/backend/menu_backend.h +++ b/frontend/menu/backend/menu_backend.h @@ -9,6 +9,7 @@ typedef struct menu_file_list_cbs { int (*action_ok)(const char *path, const char *label, unsigned type, size_t index); + int (*action_start)(unsigned type, const char *label, unsigned action); int (*action_toggle)(unsigned type, const char *label, unsigned action); } menu_file_list_cbs_t; diff --git a/frontend/menu/backend/menu_common_backend.c b/frontend/menu/backend/menu_common_backend.c index d9a5e653e1..a8d49e883a 100644 --- a/frontend/menu/backend/menu_common_backend.c +++ b/frontend/menu/backend/menu_common_backend.c @@ -215,30 +215,15 @@ static int menu_start_screen_iterate(unsigned action) } static int menu_setting_start_pressed(unsigned type, - const char *dir, const char *label, - unsigned action) + const char *label, unsigned action) { - if (type >= MENU_SETTINGS_BIND_BEGIN && - type <= MENU_SETTINGS_BIND_ALL_LAST) - { - struct retro_keybind *bind = (struct retro_keybind*) - &g_settings.input.binds[driver.menu->current_pad] - [type - MENU_SETTINGS_BIND_BEGIN]; + menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*) + file_list_get_actiondata_at_offset(driver.menu->selection_buf, + driver.menu->selection_ptr); - if (driver.menu->bind_mode_keyboard) - { - const struct retro_keybind *def_binds = driver.menu->current_pad ? - retro_keybinds_rest : retro_keybinds_1; - bind->key = def_binds[type - MENU_SETTINGS_BIND_BEGIN].key; - } - else - { - bind->joykey = NO_BTN; - bind->joyaxis = AXIS_NONE; - } + if (cbs && cbs->action_start) + return cbs->action_start(type, label, action); - return 0; - } return -1; } @@ -300,7 +285,7 @@ static int menu_settings_iterate(unsigned action) return 0; /* fall-through */ case MENU_ACTION_START: - if (menu_setting_start_pressed(type, path, label, action) == 0) + if (menu_setting_start_pressed(type, label, action) == 0) return 0; /* fall-through */ case MENU_ACTION_LEFT: diff --git a/frontend/menu/menu_entries_cbs.c b/frontend/menu/menu_entries_cbs.c index 4dc5ae1f1e..9bf9fca7bb 100644 --- a/frontend/menu/menu_entries_cbs.c +++ b/frontend/menu/menu_entries_cbs.c @@ -653,6 +653,38 @@ static int core_setting_toggle(unsigned type, const char *label, return 0; } +static int action_start_bind(unsigned type, const char *label, + unsigned action) +{ + struct retro_keybind *def_binds = (struct retro_keybind *)retro_keybinds_1; + struct retro_keybind *bind = (struct retro_keybind*) + &g_settings.input.binds[driver.menu->current_pad] + [type - MENU_SETTINGS_BIND_BEGIN]; + + if (!bind) + return -1; + + (void)label; + (void)action; + + if (!driver.menu->bind_mode_keyboard) + { + bind->joykey = NO_BTN; + bind->joyaxis = AXIS_NONE; + return 0; + } + + if (driver.menu->current_pad) + def_binds = (struct retro_keybind*)retro_keybinds_rest; + + if (!def_binds) + return -1; + + bind->key = def_binds[type - MENU_SETTINGS_BIND_BEGIN].key; + + return 0; +} + /* Bind the OK callback function */ static int menu_entries_cbs_init_bind_ok_first(menu_file_list_cbs_t *cbs, @@ -740,6 +772,19 @@ static int menu_entries_cbs_init_bind_ok_first(menu_file_list_cbs_t *cbs, return 0; } +static void menu_entries_cbs_init_bind_start(menu_file_list_cbs_t *cbs, + const char *path, const char *label, unsigned type, size_t index) +{ + if (!cbs) + return; + + cbs->action_start = NULL; + + if (type >= MENU_SETTINGS_BIND_BEGIN && + type <= MENU_SETTINGS_BIND_ALL_LAST) + cbs->action_start = action_start_bind; +} + static void menu_entries_cbs_init_bind_ok(menu_file_list_cbs_t *cbs, const char *path, const char *label, unsigned type, size_t index) { @@ -825,6 +870,7 @@ void menu_entries_cbs_init(void *data, if (cbs) { menu_entries_cbs_init_bind_ok(cbs, path, label, type, index); + menu_entries_cbs_init_bind_start(cbs, path, label, type, index); menu_entries_cbs_init_bind_toggle(cbs, path, label, type, index); } }