diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index c67f240914..c2264249d0 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -402,6 +402,7 @@ end: static void mui_render(void *data) { + size_t i = 0; float delta_time, dt; unsigned bottom, width, height, header_height; mui_handle_t *mui = (mui_handle_t*)data; @@ -461,10 +462,11 @@ static void mui_render(void *data) < height - header_height - mui->tabs_height) mui->scroll_y = 0; - if (menu_entries_get_end() < height / mui->line_height) - menu_entries_set_start(0); + if (menu_entries_get_end() < height / mui->line_height) { } else - menu_entries_set_start(mui->scroll_y / mui->line_height); + i = mui->scroll_y / mui->line_height; + + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &i); } static void mui_render_label_value(mui_handle_t *mui, @@ -582,7 +584,9 @@ static void mui_render_menu_list(mui_handle_t *mui, mui->list_block.carr.coords.vertices = 0; - for (i = menu_entries_get_start(); i < end; i++) + menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i); + + for (; i < end; i++) { int y; size_t selection; @@ -1078,11 +1082,12 @@ static void mui_list_set_selection(void *data, file_list_t *list) static void mui_navigation_clear(void *data, bool pending_push) { + size_t i = 0; mui_handle_t *mui = (mui_handle_t*)data; if (!mui) return; - menu_entries_set_start(0); + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &i); mui->scroll_y = 0; } diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 99c1dea543..ed751b41fb 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -411,7 +411,7 @@ static void rgui_render(void *data) unsigned x, y; bool display_kb, msg_force; uint16_t hover_color, normal_color; - size_t i, end, fb_pitch; + size_t i, end, fb_pitch, old_start; unsigned fb_width, fb_height; int bottom; uint64_t *frame_count; @@ -469,17 +469,26 @@ static void rgui_render(void *data) if (settings->menu.pointer.enable) { bool pointer_dragged = false; - unsigned new_val = menu_input_pointer_state(MENU_POINTER_Y_AXIS) - / 11 - 2 + menu_entries_get_start(); + unsigned new_val; + + menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &old_start); + + new_val = menu_input_pointer_state(MENU_POINTER_Y_AXIS) + / 11 - 2 + old_start; menu_input_ctl(MENU_INPUT_CTL_POINTER_PTR, &new_val); menu_input_ctl(MENU_INPUT_CTL_POINTER_DRAGGING, &pointer_dragged); if (pointer_dragged) { + size_t start; int16_t delta_y = menu_input_pointer_state(MENU_POINTER_DELTA_Y_AXIS); rgui->scroll_y += delta_y; - menu_entries_set_start(-rgui->scroll_y / 11 + 2); + + start = -rgui->scroll_y / 11 + 2; + + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &start); + if (rgui->scroll_y > 0) rgui->scroll_y = 0; } @@ -490,21 +499,30 @@ static void rgui_render(void *data) unsigned new_mouse_ptr; int16_t mouse_y = menu_input_mouse_state(MENU_MOUSE_Y_AXIS); - new_mouse_ptr = mouse_y / 11 - 2 + menu_entries_get_start(); + menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &old_start); + + new_mouse_ptr = mouse_y / 11 - 2 + old_start; menu_input_ctl(MENU_INPUT_CTL_MOUSE_PTR, &new_mouse_ptr); } /* Do not scroll if all items are visible. */ if (menu_entries_get_end() <= RGUI_TERM_HEIGHT(fb_width, fb_height)) - menu_entries_set_start(0);; + { + size_t start = 0; + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &start); + } - bottom = menu_entries_get_end() - RGUI_TERM_HEIGHT(fb_width, fb_height); - if (menu_entries_get_start() > (unsigned)bottom) - menu_entries_set_start(bottom); + bottom = menu_entries_get_end() - RGUI_TERM_HEIGHT(fb_width, fb_height); + menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &old_start); - end = ((menu_entries_get_start() + RGUI_TERM_HEIGHT(fb_width, fb_height)) <= (menu_entries_get_end())) ? - menu_entries_get_start() + RGUI_TERM_HEIGHT(fb_width, fb_height) : menu_entries_get_end(); + if (old_start > (unsigned)bottom) + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &bottom); + + menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &old_start); + + end = ((old_start + RGUI_TERM_HEIGHT(fb_width, fb_height)) <= (menu_entries_get_end())) ? + old_start + RGUI_TERM_HEIGHT(fb_width, fb_height) : menu_entries_get_end(); rgui_render_background(); @@ -553,7 +571,8 @@ static void rgui_render(void *data) x = RGUI_TERM_START_X(fb_width); y = RGUI_TERM_START_Y(fb_height); - i = menu_entries_get_start(); + + menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i); for (; i < end; i++, y += FONT_HEIGHT_STRIDE) { @@ -629,7 +648,7 @@ static void rgui_render(void *data) static void *rgui_init(void **userdata) { - size_t fb_pitch; + size_t fb_pitch, start; unsigned fb_width, fb_height, new_font_height; uint16_t *fb_data = NULL; rgui_t *rgui = NULL; @@ -663,7 +682,8 @@ static void *rgui_init(void **userdata) menu_display_ctl(MENU_DISPLAY_CTL_SET_HEADER_HEIGHT, &new_font_height); menu_display_ctl(MENU_DISPLAY_CTL_SET_FB_PITCH, &fb_pitch); - menu_entries_set_start(0); + start = 0; + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &start); ret = rguidisp_init_font(menu); @@ -727,18 +747,21 @@ static void rgui_set_texture(void) static void rgui_navigation_clear(void *data, bool pending_push) { + size_t start; rgui_t *rgui = (rgui_t*)data; if (!rgui) return; - menu_entries_set_start(0); + start = 0; + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &start); rgui->scroll_y = 0; } static void rgui_navigation_set(void *data, bool scroll) { - size_t selection; + size_t selection, start; unsigned fb_width, fb_height; + bool do_set_start = false; size_t end = menu_entries_get_end(); if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) return; @@ -749,12 +772,24 @@ static void rgui_navigation_set(void *data, bool scroll) menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); if (selection < RGUI_TERM_HEIGHT(fb_width, fb_height) /2) - menu_entries_set_start(0); + { + start = 0; + do_set_start = true; + } else if (selection >= (RGUI_TERM_HEIGHT(fb_width, fb_height) /2) && selection < (end - RGUI_TERM_HEIGHT(fb_width, fb_height) /2)) - menu_entries_set_start(selection - RGUI_TERM_HEIGHT(fb_width, fb_height) /2); + { + start = selection - RGUI_TERM_HEIGHT(fb_width, fb_height) /2; + do_set_start = true; + } else if (selection >= (end - RGUI_TERM_HEIGHT(fb_width, fb_height) /2)) - menu_entries_set_start(end - RGUI_TERM_HEIGHT(fb_width, fb_height)); + { + start = end - RGUI_TERM_HEIGHT(fb_width, fb_height); + do_set_start = true; + } + + if (do_set_start) + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &start); } static void rgui_navigation_set_last(void *data) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 9638bc4963..ebeba7a366 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -537,9 +537,10 @@ static void xmb_update_boxart_image(xmb_handle_t *xmb) static void xmb_selection_pointer_changed(xmb_handle_t *xmb, bool allow_animations) { - size_t selection; - unsigned i, end, tag, height, skip, depth; - int threshold = 0; + size_t skip; + unsigned i, end, tag, height, depth; + size_t selection, num = 0; + int threshold = 0; menu_list_t *menu_list = NULL; file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); settings_t *settings = config_get_ptr(); @@ -558,7 +559,7 @@ static void xmb_selection_pointer_changed(xmb_handle_t *xmb, bool allow_animatio video_driver_get_size(NULL, &height); menu_animation_kill_by_tag(tag); - menu_entries_set_start(0); + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &num); skip = 0; for (i = 0; i < end; i++) @@ -605,7 +606,7 @@ static void xmb_selection_pointer_changed(xmb_handle_t *xmb, bool allow_animatio } } - menu_entries_set_start(skip); + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &skip); } static void xmb_list_open_old(xmb_handle_t *xmb, @@ -658,6 +659,7 @@ static void xmb_list_open_new(xmb_handle_t *xmb, file_list_t *list, int dir, size_t current) { unsigned i, height; + size_t skip = 0; int threshold = xmb->icon.size * 10; size_t end = file_list_get_size(list); @@ -709,7 +711,7 @@ static void xmb_list_open_new(xmb_handle_t *xmb, } xmb->old_depth = xmb->depth; - menu_entries_set_start(0); + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &skip); } static xmb_node_t *xmb_node_allocate_userdata(xmb_handle_t *xmb, unsigned i) @@ -1281,7 +1283,8 @@ static void xmb_draw_items(xmb_handle_t *xmb, unsigned width, unsigned height) { uint64_t *frame_count; - unsigned i, ticker_limit; + size_t i; + unsigned ticker_limit; math_matrix_4x4 mymat; xmb_node_t *core_node = NULL; size_t end = 0; @@ -1299,7 +1302,7 @@ static void xmb_draw_items(xmb_handle_t *xmb, menu_display_matrix_4x4_rotate_z(&mymat, 0, 1, 1, 1, true); - i = menu_entries_get_start(); + menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i); if (list == xmb->selection_buf_old) i = 0; @@ -1574,8 +1577,13 @@ static void xmb_render(void *data) } } - if (menu_entries_get_start() >= end) - menu_entries_set_start(0); + menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i); + + if (i >= end) + { + i = 0; + menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &i); + } menu_animation_ctl(MENU_ANIMATION_CTL_CLEAR_ACTIVE, NULL); } diff --git a/menu/menu_entries.c b/menu/menu_entries.c index af6f951da8..39ee4ee43b 100644 --- a/menu/menu_entries.c +++ b/menu/menu_entries.c @@ -35,7 +35,6 @@ struct menu_list struct menu_entries { - size_t begin; menu_list_t *menu_list; rarch_setting_t *list_settings; }; @@ -353,22 +352,6 @@ void menu_entries_refresh(file_list_t *list) } } -/* Sets the starting index of the menu entry list. */ -void menu_entries_set_start(size_t i) -{ - if (menu_entries_data) - menu_entries_data->begin = i; -} - -/* Returns the starting index of the menu entry list. */ -size_t menu_entries_get_start(void) -{ - if (!menu_entries_data) - return 0; - - return menu_entries_data->begin; -} - /* Returns the last index (+1) of the menu entry list. */ size_t menu_entries_get_end(void) { @@ -658,6 +641,7 @@ bool menu_entries_ctl(enum menu_entries_ctl_state state, void *data) /* Flagged when menu entries need to be refreshed */ static bool menu_entries_need_refresh = false; static bool menu_entries_nonblocking_refresh = false; + static size_t menu_entries_begin = 0; switch (state) { @@ -676,6 +660,7 @@ bool menu_entries_ctl(enum menu_entries_ctl_state state, void *data) menu_entries_need_refresh = NULL; menu_entries_nonblocking_refresh = NULL; menu_entries_data = NULL; + menu_entries_begin = 0; return true; case MENU_ENTRIES_CTL_NEEDS_REFRESH: if (!menu_entries_data || menu_entries_nonblocking_refresh) @@ -721,6 +706,21 @@ bool menu_entries_ctl(enum menu_entries_ctl_state state, void *data) menu_entries_need_refresh = false; } return true; + case MENU_ENTRIES_CTL_SET_START: + { + size_t *idx = (size_t*)data; + if (idx) + menu_entries_begin = *idx; + } + case MENU_ENTRIES_CTL_START_GET: + { + size_t *idx = (size_t*)data; + if (!idx) + return 0; + + *idx = menu_entries_begin; + } + return true; case MENU_ENTRIES_CTL_INIT: return menu_entries_init(); case MENU_ENTRIES_CTL_SHOW_BACK: diff --git a/menu/menu_entries.h b/menu/menu_entries.h index 48a3e789ea..0a32bd87be 100644 --- a/menu/menu_entries.h +++ b/menu/menu_entries.h @@ -111,15 +111,15 @@ enum menu_entries_ctl_state MENU_ENTRIES_CTL_SET_REFRESH, MENU_ENTRIES_CTL_UNSET_REFRESH, MENU_ENTRIES_CTL_NEEDS_REFRESH, + /* Sets the starting index of the menu entry list. */ + MENU_ENTRIES_CTL_SET_START, + /* Returns the starting index of the menu entry list. */ + MENU_ENTRIES_CTL_START_GET, MENU_ENTRIES_CTL_SHOW_BACK }; typedef struct menu_list menu_list_t; -void menu_entries_set_start(size_t i); - -size_t menu_entries_get_start(void); - size_t menu_entries_get_end(void); void menu_entries_get(size_t i, menu_entry_t *entry); diff --git a/ui/drivers/cocoa/cocoatouch_menu.m b/ui/drivers/cocoa/cocoatouch_menu.m index ba5db77892..3d54b9855a 100644 --- a/ui/drivers/cocoa/cocoatouch_menu.m +++ b/ui/drivers/cocoa/cocoatouch_menu.m @@ -665,7 +665,9 @@ didSelectRowAtIndexPath:(NSIndexPath *)indexPath self.title = BOXSTRING(title); end = menu_entries_get_end(); - for (i = menu_entries_get_start(); i < end; i++) + menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i); + + for (; i < end; i++) [everything addObject:[self make_menu_item_for_entry: i]]; self.sections = [NSMutableArray array];