diff --git a/frontend/menu/backend/menu_common_backend.c b/frontend/menu/backend/menu_common_backend.c index e2b4809007..16f6fe2729 100644 --- a/frontend/menu/backend/menu_common_backend.c +++ b/frontend/menu/backend/menu_common_backend.c @@ -217,6 +217,14 @@ static int mouse_iterate(unsigned action) driver.menu->mouse.right = driver.input->input_state(driver.input_data, binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT); + driver.menu->mouse.wheelup = driver.input->input_state(driver.input_data, + binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELUP) + || driver.menu->mouse.y == 5; + + driver.menu->mouse.wheeldown = driver.input->input_state(driver.input_data, + binds, 0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELDOWN) + || driver.menu->mouse.y == driver.menu->height - 5; + return 0; } @@ -227,9 +235,9 @@ static int mouse_post_iterate(menu_file_list_cbs_t *cbs, unsigned action) if (driver.menu->mouse.dy) { - unsigned mouse_ptr = driver.menu->mouse.y / 11 - 2; - if (mouse_ptr <= menu_list_get_size(driver.menu->menu_list)) - menu_navigation_set(driver.menu, mouse_ptr); + unsigned mouse_ptr = driver.menu->mouse.y / 11 - 2 + driver.menu->begin; + if (mouse_ptr <= menu_list_get_size(driver.menu->menu_list)-1) + menu_navigation_set(driver.menu, mouse_ptr, false); } if (driver.menu->mouse.left) @@ -279,16 +287,16 @@ static int menu_settings_iterate(unsigned action, case MENU_ACTION_UP: if (driver.menu->selection_ptr >= scroll_speed) menu_navigation_set(driver.menu, - driver.menu->selection_ptr - scroll_speed); + driver.menu->selection_ptr - scroll_speed, true); else menu_navigation_set(driver.menu, - menu_list_get_size(driver.menu->menu_list) - 1); + menu_list_get_size(driver.menu->menu_list) - 1, true); break; case MENU_ACTION_DOWN: if (driver.menu->selection_ptr + scroll_speed < (menu_list_get_size(driver.menu->menu_list))) menu_navigation_set(driver.menu, - driver.menu->selection_ptr + scroll_speed); + driver.menu->selection_ptr + scroll_speed, true); else menu_navigation_clear(driver.menu, false); break; @@ -670,16 +678,16 @@ static int menu_common_iterate(unsigned action) case MENU_ACTION_UP: if (driver.menu->selection_ptr >= scroll_speed) menu_navigation_set(driver.menu, - driver.menu->selection_ptr - scroll_speed); + driver.menu->selection_ptr - scroll_speed, true); else menu_navigation_set(driver.menu, - menu_list_get_size(driver.menu->menu_list) - 1); + menu_list_get_size(driver.menu->menu_list) - 1, true); break; case MENU_ACTION_DOWN: if (driver.menu->selection_ptr + scroll_speed < (menu_list_get_size(driver.menu->menu_list))) menu_navigation_set(driver.menu, - driver.menu->selection_ptr + scroll_speed); + driver.menu->selection_ptr + scroll_speed, true); else menu_navigation_clear(driver.menu, false); break; @@ -687,7 +695,7 @@ static int menu_common_iterate(unsigned action) case MENU_ACTION_LEFT: if (driver.menu->selection_ptr > fast_scroll_speed) menu_navigation_set(driver.menu, - driver.menu->selection_ptr - fast_scroll_speed); + driver.menu->selection_ptr - fast_scroll_speed, true); else menu_navigation_clear(driver.menu, false); break; @@ -695,7 +703,7 @@ static int menu_common_iterate(unsigned action) case MENU_ACTION_RIGHT: if (driver.menu->selection_ptr + fast_scroll_speed < (menu_list_get_size(driver.menu->menu_list))) menu_navigation_set(driver.menu, - driver.menu->selection_ptr + fast_scroll_speed); + driver.menu->selection_ptr + fast_scroll_speed, true); else menu_navigation_set_last(driver.menu); break; diff --git a/frontend/menu/disp/menu_display.h b/frontend/menu/disp/menu_display.h index f77bd9b36f..f084884e35 100644 --- a/frontend/menu/disp/menu_display.h +++ b/frontend/menu/disp/menu_display.h @@ -23,7 +23,7 @@ typedef struct menu_ctx_driver void (*navigation_clear)(void *, bool); void (*navigation_decrement)(void *); void (*navigation_increment)(void *); - void (*navigation_set)(void *); + void (*navigation_set)(void *, bool); void (*navigation_set_last)(void *); void (*navigation_descend_alphabet)(void *, size_t *); void (*navigation_ascend_alphabet)(void *, size_t *); diff --git a/frontend/menu/disp/rgui.c b/frontend/menu/disp/rgui.c index b42c810955..eeec75b115 100644 --- a/frontend/menu/disp/rgui.c +++ b/frontend/menu/disp/rgui.c @@ -291,7 +291,6 @@ static void blit_cursor(void) static void rgui_render(void) { - size_t begin = 0; size_t end; if (driver.menu->need_refresh @@ -299,19 +298,21 @@ static void rgui_render(void) && !driver.menu->msg_force) return; - if (driver.menu->selection_ptr >= RGUI_TERM_HEIGHT / 2) - begin = driver.menu->selection_ptr - RGUI_TERM_HEIGHT / 2; - end = (driver.menu->selection_ptr + RGUI_TERM_HEIGHT <= - menu_list_get_size(driver.menu->menu_list)) ? - driver.menu->selection_ptr + RGUI_TERM_HEIGHT : - menu_list_get_size(driver.menu->menu_list); + if (driver.menu->mouse.wheeldown && driver.menu->begin + < menu_list_get_size(driver.menu->menu_list) - RGUI_TERM_HEIGHT) + driver.menu->begin++; + + if (driver.menu->mouse.wheelup && driver.menu->begin > 0) + driver.menu->begin--; /* Do not scroll if all items are visible. */ if (menu_list_get_size(driver.menu->menu_list) <= RGUI_TERM_HEIGHT) - begin = 0; + driver.menu->begin = 0; - if (end - begin > RGUI_TERM_HEIGHT) - end = begin + RGUI_TERM_HEIGHT; + end = (driver.menu->begin + RGUI_TERM_HEIGHT <= + menu_list_get_size(driver.menu->menu_list)) ? + driver.menu->begin + RGUI_TERM_HEIGHT : + menu_list_get_size(driver.menu->menu_list); rgui_render_background(); @@ -359,7 +360,7 @@ static void rgui_render(void) x = RGUI_TERM_START_X; y = RGUI_TERM_START_Y; - for (i = begin; i < end; i++, y += FONT_HEIGHT_STRIDE) + for (i = driver.menu->begin; i < end; i++, y += FONT_HEIGHT_STRIDE) { char message[PATH_MAX], type_str[PATH_MAX], entry_title_buf[PATH_MAX], type_str_buf[PATH_MAX], @@ -452,6 +453,7 @@ static void *rgui_init(void) menu->width = 320; menu->height = 240; + menu->begin = 0; menu->frame_buf_pitch = menu->width * sizeof(uint16_t); bool ret = rguidisp_init_font(menu); @@ -504,6 +506,28 @@ static void rgui_set_texture(void *data) menu->frame_buf, false, menu->width, menu->height, 1.0f); } +static void rgui_navigation_clear(void *data, bool pending_push) +{ + driver.menu->begin = 0; +} + +static void rgui_navigation_set(void *data, bool scroll) +{ + if (!scroll) + return; + + if (driver.menu->selection_ptr < RGUI_TERM_HEIGHT/2) + driver.menu->begin = 0; + else if (driver.menu->selection_ptr >= RGUI_TERM_HEIGHT/2 + && driver.menu->selection_ptr < + menu_list_get_size(driver.menu->menu_list) - RGUI_TERM_HEIGHT/2) + driver.menu->begin = driver.menu->selection_ptr - RGUI_TERM_HEIGHT/2; + else if (driver.menu->selection_ptr >= + menu_list_get_size(driver.menu->menu_list) - RGUI_TERM_HEIGHT/2) + driver.menu->begin = menu_list_get_size(driver.menu->menu_list) + - RGUI_TERM_HEIGHT; +} + menu_ctx_driver_t menu_ctx_rgui = { rgui_set_texture, rgui_render_messagebox, @@ -517,10 +541,10 @@ menu_ctx_driver_t menu_ctx_rgui = { NULL, NULL, NULL, + rgui_navigation_clear, NULL, NULL, - NULL, - NULL, + rgui_navigation_set, NULL, NULL, NULL, diff --git a/frontend/menu/disp/xmb.c b/frontend/menu/disp/xmb.c index d76015a4ac..71c14f0994 100644 --- a/frontend/menu/disp/xmb.c +++ b/frontend/menu/disp/xmb.c @@ -974,9 +974,10 @@ static void xmb_navigation_increment(void *data) xmb_selection_pointer_changed(); } -static void xmb_navigation_set(void *data) +static void xmb_navigation_set(void *data, bool scroll) { (void)data; + (void)scroll; xmb_selection_pointer_changed(); } diff --git a/frontend/menu/menu_driver.h b/frontend/menu/menu_driver.h index b3ff331286..5663dffb88 100644 --- a/frontend/menu/menu_driver.h +++ b/frontend/menu/menu_driver.h @@ -75,6 +75,7 @@ typedef struct unsigned width; unsigned height; + size_t begin; uint16_t *frame_buf; size_t frame_buf_pitch; diff --git a/frontend/menu/menu_entries.c b/frontend/menu/menu_entries.c index 0be6e31076..055b34739b 100644 --- a/frontend/menu/menu_entries.c +++ b/frontend/menu/menu_entries.c @@ -37,7 +37,7 @@ void menu_entries_refresh(file_list_t *list) if (driver.menu->selection_ptr >= menu_list_get_size(driver.menu->menu_list) && menu_list_get_size(driver.menu->menu_list)) - menu_navigation_set(driver.menu, menu_list_get_size(driver.menu->menu_list) - 1); + menu_navigation_set(driver.menu, menu_list_get_size(driver.menu->menu_list) - 1, true); else if (!menu_list_get_size(driver.menu->menu_list)) menu_navigation_clear(driver.menu, true); } diff --git a/frontend/menu/menu_input_line_cb.c b/frontend/menu/menu_input_line_cb.c index c621f67b0a..6b9b93f8f4 100644 --- a/frontend/menu/menu_input_line_cb.c +++ b/frontend/menu/menu_input_line_cb.c @@ -66,7 +66,7 @@ static void menu_search_callback(void *userdata, const char *str) size_t idx; if (str && *str && file_list_search(menu->menu_list->selection_buf, str, &idx)) - menu_navigation_set(menu, idx); + menu_navigation_set(menu, idx, true); menu_key_end_line(menu); } diff --git a/frontend/menu/menu_navigation.c b/frontend/menu/menu_navigation.c index 4a2da12c78..93e47d7a45 100644 --- a/frontend/menu/menu_navigation.c +++ b/frontend/menu/menu_navigation.c @@ -48,12 +48,12 @@ void menu_navigation_increment(menu_handle_t *menu) driver.menu_ctx->navigation_increment(menu); } -void menu_navigation_set(menu_handle_t *menu, size_t i) +void menu_navigation_set(menu_handle_t *menu, size_t i, bool scroll) { menu->selection_ptr = i; if (driver.menu_ctx && driver.menu_ctx->navigation_set) - driver.menu_ctx->navigation_set(menu); + driver.menu_ctx->navigation_set(menu, scroll); } void menu_navigation_set_last(menu_handle_t *menu) diff --git a/frontend/menu/menu_navigation.h b/frontend/menu/menu_navigation.h index d148906ccf..337fe1c306 100644 --- a/frontend/menu/menu_navigation.h +++ b/frontend/menu/menu_navigation.h @@ -29,7 +29,7 @@ void menu_navigation_decrement(menu_handle_t *menu); void menu_navigation_increment(menu_handle_t *menu); -void menu_navigation_set(menu_handle_t *menu, size_t i); +void menu_navigation_set(menu_handle_t *menu, size_t i, bool scroll); void menu_navigation_set_last(menu_handle_t *menu);