diff --git a/menu/menu_input.c b/menu/menu_input.c index 6e1d745ddf..c80c903f98 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -1214,13 +1214,14 @@ unsigned menu_input_frame(retro_input_t input, retro_input_t trigger_input) | (1UL << RETRO_DEVICE_ID_JOYPAD_RIGHT) | (1UL << RETRO_DEVICE_ID_JOYPAD_L) | (1UL << RETRO_DEVICE_ID_JOYPAD_R); - menu_navigation_t *nav = menu_navigation_get_ptr(); - menu_display_t *disp = menu_display_get_ptr(); - menu_input_t *menu_input = menu_input_get_ptr(); - driver_t *driver = driver_get_ptr(); - settings_t *settings = config_get_ptr(); + bool set_scroll = false; + size_t new_scroll_accel = 0; + menu_display_t *disp = menu_display_get_ptr(); + menu_input_t *menu_input = menu_input_get_ptr(); + driver_t *driver = driver_get_ptr(); + settings_t *settings = config_get_ptr(); - if (!driver || !nav || !menu_input) + if (!driver || !menu_input) return 0; driver->retro_ctx.poll_cb(); @@ -1239,21 +1240,29 @@ unsigned menu_input_frame(retro_input_t input, retro_input_t trigger_input) if (menu_input->delay.count >= menu_input->delay.timer) { - first_held = false; + set_scroll = true; + first_held = false; trigger_input |= input & input_repeat; - nav->scroll.acceleration = - min(nav->scroll.acceleration + 1, 64); + + menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SCROLL_ACCEL, + &new_scroll_accel); + + new_scroll_accel = min(new_scroll_accel + 1, 64); } - initial_held = false; + initial_held = false; } else { - first_held = false; + set_scroll = true; + first_held = false; initial_held = true; - nav->scroll.acceleration = 0; } + if (set_scroll) + menu_navigation_ctl(MENU_NAVIGATION_CTL_SET_SCROLL_ACCEL, + &new_scroll_accel); + menu_input->delay.count += menu_animation_get_delta_time(disp->animation) / IDEAL_DT; if (menu_input->keyboard.display) diff --git a/menu/menu_navigation.c b/menu/menu_navigation.c index 208b0e77c4..8050f689b1 100644 --- a/menu/menu_navigation.c +++ b/menu/menu_navigation.c @@ -209,6 +209,22 @@ bool menu_navigation_ctl(enum menu_navigation_ctl_state state, void *data) nav->scroll.indices.list[nav->scroll.indices.size++] = *sel; } return true; + case MENU_NAVIGATION_CTL_GET_SCROLL_ACCEL: + { + size_t *sel = (size_t*)data; + if (!nav || !sel) + return false; + *sel = nav->scroll.acceleration; + } + return true; + case MENU_NAVIGATION_CTL_SET_SCROLL_ACCEL: + { + size_t *sel = (size_t*)data; + if (!nav || !sel) + return false; + nav->scroll.acceleration = *sel; + } + return true; } return false; diff --git a/menu/menu_navigation.h b/menu/menu_navigation.h index ec04b21f17..6e7698f599 100644 --- a/menu/menu_navigation.h +++ b/menu/menu_navigation.h @@ -56,7 +56,9 @@ enum menu_navigation_ctl_state MENU_NAVIGATION_CTL_SET_SELECTION, MENU_NAVIGATION_CTL_GET_SELECTION, MENU_NAVIGATION_CTL_CLEAR_SCROLL_INDICES, - MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX + MENU_NAVIGATION_CTL_ADD_SCROLL_INDEX, + MENU_NAVIGATION_CTL_SET_SCROLL_ACCEL, + MENU_NAVIGATION_CTL_GET_SCROLL_ACCEL }; bool menu_navigation_ctl(enum menu_navigation_ctl_state state, void *data);