diff --git a/menu/cbs/menu_cbs_up.c b/menu/cbs/menu_cbs_up.c index 6cc39aa0a7..74188a9f45 100644 --- a/menu/cbs/menu_cbs_up.c +++ b/menu/cbs/menu_cbs_up.c @@ -30,7 +30,7 @@ static int action_bind_up_generic(unsigned type, const char *label) if (menu_list_get_size(menu_list) <= 0) return 0; - menu_navigation_decrement(nav, scroll_speed); + menu_navigation_ctl(MENU_NAVIGATION_CTL_DECREMENT, &scroll_speed); return 0; } diff --git a/menu/menu_input.c b/menu/menu_input.c index 69e42347b1..629c314a9f 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -905,7 +905,10 @@ static int menu_input_mouse_frame( menu_navigation_increment(nav, 1); if (BIT64_GET(input_mouse, MOUSE_ACTION_WHEEL_UP)) - menu_navigation_decrement(nav, 1); + { + unsigned decrement_by = 1; + menu_navigation_ctl(MENU_NAVIGATION_CTL_DECREMENT, &decrement_by); + } return 0; } diff --git a/menu/menu_navigation.c b/menu/menu_navigation.c index bf324c6d06..464c800f08 100644 --- a/menu/menu_navigation.c +++ b/menu/menu_navigation.c @@ -28,12 +28,17 @@ bool menu_navigation_ctl(enum menu_navigation_ctl_state state, void *data) { const menu_ctx_driver_t *driver = menu_ctx_driver_get_ptr(); + menu_navigation_t *nav = menu_navigation_get_ptr(); switch (state) { case MENU_NAVIGATION_CTL_CLEAR: { bool *pending_push = (bool*)data; + + if (!pending_push) + return false; + if (driver->navigation_clear) driver->navigation_clear(*pending_push); } @@ -43,13 +48,38 @@ bool menu_navigation_ctl(enum menu_navigation_ctl_state state, void *data) driver->navigation_increment(); return true; case MENU_NAVIGATION_CTL_DECREMENT: - if (driver->navigation_decrement) - driver->navigation_decrement(); + { + menu_list_t *menu_list = menu_list_get_ptr(); + settings_t *settings = config_get_ptr(); + size_t selection = nav->selection_ptr; + unsigned *scroll_speed = (unsigned*)data; + + if (!scroll_speed) + return false; + + if (selection >= *scroll_speed) + menu_navigation_set(nav, selection - *scroll_speed, true); + else + { + if (settings->menu.navigation.wraparound.vertical_enable) + menu_navigation_set(nav, + menu_list_get_size(menu_list) - 1, true); + else + menu_navigation_set(nav, 0, true); + } + + menu_navigation_ctl(MENU_NAVIGATION_CTL_DECREMENT, NULL); + if (driver->navigation_decrement) + driver->navigation_decrement(); + } return true; case MENU_NAVIGATION_CTL_SET: { bool *scroll = (bool*)data; + if (!scroll) + return false; + if (driver->navigation_set) driver->navigation_set(*scroll); } @@ -62,6 +92,9 @@ bool menu_navigation_ctl(enum menu_navigation_ctl_state state, void *data) { size_t *ptr_out = (size_t*)data; + if (!ptr_out) + return false; + if (driver->navigation_ascend_alphabet) driver->navigation_ascend_alphabet(ptr_out); } @@ -70,6 +103,9 @@ bool menu_navigation_ctl(enum menu_navigation_ctl_state state, void *data) { size_t *ptr_out = (size_t*)data; + if (!ptr_out) + return false; + if (driver->navigation_descend_alphabet) driver->navigation_descend_alphabet(ptr_out); } @@ -94,34 +130,6 @@ void menu_navigation_clear(menu_navigation_t *nav, bool pending_push) menu_navigation_ctl(MENU_NAVIGATION_CTL_CLEAR, &pending_push); } -/** - * menu_navigation_decrement: - * - * Decrement the navigation pointer. - **/ -void menu_navigation_decrement(menu_navigation_t *nav, unsigned scroll_speed) -{ - menu_list_t *menu_list = menu_list_get_ptr(); - settings_t *settings = config_get_ptr(); - size_t selection = nav->selection_ptr; - - if (!nav) - return; - - if (selection >= scroll_speed) - menu_navigation_set(nav, selection - scroll_speed, true); - else - { - if (settings->menu.navigation.wraparound.vertical_enable) - menu_navigation_set(nav, - menu_list_get_size(menu_list) - 1, true); - else - menu_navigation_set(nav, 0, true); - } - - menu_navigation_ctl(MENU_NAVIGATION_CTL_DECREMENT, NULL); -} - /** * menu_navigation_increment: * diff --git a/menu/menu_navigation.h b/menu/menu_navigation.h index dd9b225854..106a121f07 100644 --- a/menu/menu_navigation.h +++ b/menu/menu_navigation.h @@ -63,13 +63,6 @@ enum menu_navigation_ctl_state **/ void menu_navigation_clear(menu_navigation_t *nav, bool pending_push); -/** - * menu_navigation_decrement: - * - * Decrement the navigation pointer. - **/ -void menu_navigation_decrement(menu_navigation_t *nav, unsigned scroll_speed); - /** * menu_navigation_increment: *