diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 4534efb20d..d22a6ffd8f 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -148,7 +148,7 @@ static int action_left_mainmenu(unsigned type, const char *label, if (list_size == 1) { nav->selection_ptr = 0; - if (menu->categories.selection_ptr != 0) + if (menu_driver_list_get_selection() != 0) push_list = 1; } else diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index e2bd204cd5..5e563053dd 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -154,7 +154,7 @@ static int action_right_mainmenu(unsigned type, const char *label, if (list_size == 1) { nav->selection_ptr = 0; - if (menu->categories.selection_ptr != (menu_driver_list_get_size(MENU_LIST_HORIZONTAL))) + if (menu_driver_list_get_selection() != (menu_driver_list_get_size(MENU_LIST_HORIZONTAL))) push_list = 1; } else diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index a0d42a2ece..46829cd139 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -724,6 +724,7 @@ menu_ctx_driver_t menu_ctx_glui = { NULL, NULL, NULL, + NULL, glui_load_image, "glui", NULL, diff --git a/menu/drivers/null.c b/menu/drivers/null.c index 85fd85e856..79d18717eb 100644 --- a/menu/drivers/null.c +++ b/menu/drivers/null.c @@ -45,6 +45,7 @@ menu_ctx_driver_t menu_ctx_null = { NULL, // list_delete NULL, // list_clear NULL, // list_cache + NULL, /* list_get_selection */ NULL, // list_get_size NULL, // list_get_entry NULL, // list_set_selection diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index f7c5a13289..2a8c6ab11e 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -694,6 +694,7 @@ menu_ctx_driver_t menu_ctx_rgui = { NULL, NULL, NULL, + NULL, "rgui", NULL, }; diff --git a/menu/drivers/rmenu.c b/menu/drivers/rmenu.c index 9b6d54ba37..3c6e35455d 100644 --- a/menu/drivers/rmenu.c +++ b/menu/drivers/rmenu.c @@ -337,6 +337,7 @@ menu_ctx_driver_t menu_ctx_rmenu = { NULL, NULL, NULL, + NULL, "rmenu", NULL, }; diff --git a/menu/drivers/rmenu_xui.cpp b/menu/drivers/rmenu_xui.cpp index 0bab769fd2..b6c33fc3fa 100644 --- a/menu/drivers/rmenu_xui.cpp +++ b/menu/drivers/rmenu_xui.cpp @@ -699,6 +699,7 @@ menu_ctx_driver_t menu_ctx_rmenu_xui = { NULL, NULL, NULL, + NULL, rmenu_xui_list_set_selection, NULL, "rmenu_xui", diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index fc158c577a..8f01af2da3 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -193,6 +193,7 @@ typedef struct xmb_handle float x_pos; size_t selection_ptr_old; + size_t selection_ptr; } categories; struct @@ -231,6 +232,17 @@ static const GLfloat rmb_tex_coord[] = { 1, 0, }; +static size_t xmb_list_get_selection(void *data) +{ + menu_handle_t *menu = (menu_handle_t*)data; + xmb_handle_t *xmb = menu ? (xmb_handle_t*)menu->userdata : NULL; + + if (!xmb) + return 0; + + return xmb->categories.selection_ptr; +} + static size_t xmb_list_get_size(void *data, menu_list_type_t type) { size_t list_size = 0; @@ -767,19 +779,14 @@ static void xmb_list_switch_new(xmb_handle_t *xmb, static void xmb_set_title(xmb_handle_t *xmb) { - menu_handle_t *menu = menu_driver_get_ptr(); - - if (!menu) - return; - - if (menu->categories.selection_ptr == 0) + if (xmb->categories.selection_ptr == 0) menu_entries_get_title(xmb->title_name, sizeof(xmb->title_name)); else { const char *path = NULL; file_list_get_at_offset( xmb->horizontal_list, - menu->categories.selection_ptr - 1, + xmb->categories.selection_ptr - 1, &path, NULL, NULL, NULL); if (!path) @@ -830,7 +837,7 @@ static void xmb_list_switch(xmb_handle_t *xmb) if (!menu) return; - if (menu->categories.selection_ptr > xmb->categories.selection_ptr_old) + if (xmb->categories.selection_ptr > xmb->categories.selection_ptr_old) dir = 1; xmb->categories.active.idx += dir; @@ -838,18 +845,18 @@ static void xmb_list_switch(xmb_handle_t *xmb) xmb_list_switch_horizontal_list(xmb, menu); menu_animation_push(disp->animation, XMB_DELAY, - xmb->icon.spacing.horizontal * -(float)menu->categories.selection_ptr, + xmb->icon.spacing.horizontal * -(float)xmb->categories.selection_ptr, &xmb->categories.x_pos, EASING_IN_OUT_QUAD, NULL); dir = -1; - if (menu->categories.selection_ptr > xmb->categories.selection_ptr_old) + if (xmb->categories.selection_ptr > xmb->categories.selection_ptr_old) dir = 1; xmb_list_switch_old(xmb, xmb->selection_buf_old, dir, xmb->selection_ptr_old); xmb_list_switch_new(xmb, menu_list->selection_buf, dir, nav->selection_ptr); - xmb->categories.active.idx_old = menu->categories.selection_ptr; + xmb->categories.active.idx_old = xmb->categories.selection_ptr; } static void xmb_list_open_horizontal_list(xmb_handle_t *xmb, menu_handle_t *menu) @@ -948,7 +955,7 @@ static void xmb_populate_entries(const char *path, xmb_set_title(xmb); - if (menu->categories.selection_ptr != xmb->categories.active.idx_old) + if (xmb->categories.selection_ptr != xmb->categories.active.idx_old) xmb_list_switch(xmb); else xmb_list_open(xmb); @@ -1378,14 +1385,14 @@ static void xmb_frame(void) xmb->selection_buf_old, xmb->menu_stack_old, xmb->selection_ptr_old, - depth > 1 ? menu->categories.selection_ptr : + depth > 1 ? xmb->categories.selection_ptr : xmb->categories.selection_ptr_old); xmb_draw_items(xmb, gl, menu_list->selection_buf, menu_list->menu_stack, nav->selection_ptr, - menu->categories.selection_ptr); + xmb->categories.selection_ptr); matrix_4x4_rotate_z(&mrot, 0 /* rotation */); matrix_4x4_multiply(&mymat, &mrot, &gl->mvp_no_rot); @@ -1991,22 +1998,22 @@ static void xmb_list_cache(menu_list_type_t type, unsigned action) case MENU_LIST_PLAIN: break; case MENU_LIST_HORIZONTAL: - xmb->categories.selection_ptr_old = menu->categories.selection_ptr; + xmb->categories.selection_ptr_old = xmb->categories.selection_ptr; switch (action) { case MENU_ACTION_LEFT: - menu->categories.selection_ptr--; + xmb->categories.selection_ptr--; break; default: - menu->categories.selection_ptr++; + xmb->categories.selection_ptr++; break; } list_size = xmb_list_get_size(menu, MENU_LIST_HORIZONTAL); - if (menu->categories.selection_ptr > list_size) + if (xmb->categories.selection_ptr > list_size) { - menu->categories.selection_ptr = list_size; + xmb->categories.selection_ptr = list_size; return; } @@ -2016,7 +2023,7 @@ static void xmb_list_cache(menu_list_type_t type, unsigned action) free(menu_list->menu_stack->list[stack_size - 1].label); menu_list->menu_stack->list[stack_size - 1].label = NULL; - if (menu->categories.selection_ptr == 0) + if (xmb->categories.selection_ptr == 0) { menu_list->menu_stack->list[stack_size - 1].label = strdup(menu_hash_to_str(MENU_VALUE_MAIN_MENU)); @@ -2185,6 +2192,7 @@ menu_ctx_driver_t menu_ctx_xmb = { xmb_list_free, NULL, xmb_list_cache, + xmb_list_get_selection, xmb_list_get_size, xmb_list_get_entry, NULL, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index f168bd0b70..5c84f79af6 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1391,7 +1391,7 @@ static int menu_displaylist_parse_horizontal_list(menu_displaylist_info_t *info) settings_t *settings = config_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr(); struct item_file *item = (struct item_file*) - menu_driver_list_get_entry(MENU_LIST_HORIZONTAL, menu->categories.selection_ptr - 1); + menu_driver_list_get_entry(MENU_LIST_HORIZONTAL, menu_driver_list_get_selection() - 1); if (!item) return -1; diff --git a/menu/menu_driver.c b/menu/menu_driver.c index d986629cc9..afd07df8bf 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -218,6 +218,16 @@ void menu_driver_list_set_selection(file_list_t *list) driver->list_set_selection(list); } +size_t menu_driver_list_get_selection(void) +{ + const menu_ctx_driver_t *driver = menu_ctx_driver_get_ptr(); + menu_handle_t *menu = menu_driver_get_ptr(); + + if (driver->list_get_selection) + return driver->list_get_selection(menu); + return 0; +} + void menu_driver_list_insert(file_list_t *list, const char *path, const char *label, unsigned type, size_t idx) { diff --git a/menu/menu_driver.h b/menu/menu_driver.h index bd783b1879..f635d52e2a 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -52,11 +52,6 @@ typedef struct menu_list_t *menu_list; menu_navigation_t navigation; - struct - { - size_t selection_ptr; - } categories; - bool need_refresh; bool nonblocking_refresh; bool push_start_screen; @@ -106,6 +101,7 @@ typedef struct menu_ctx_driver void (*list_free)(file_list_t *list, size_t, size_t); void (*list_clear)(file_list_t *list); void (*list_cache)(menu_list_type_t, unsigned); + size_t(*list_get_selection)(void *data); size_t(*list_get_size)(void *data, menu_list_type_t type); void *(*list_get_entry)(void *data, menu_list_type_t type, unsigned i); void (*list_set_selection)(file_list_t *list); @@ -218,6 +214,7 @@ void menu_driver_set_alive(void); void menu_driver_unset_alive(void); +size_t menu_driver_list_get_selection(void); int menu_driver_bind_init(menu_file_list_cbs_t *cbs, const char *path, const char *label, unsigned type, size_t idx,