From 9fe3f9409ed2300ac0a0546d92594dfa9700b2c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Andr=C3=A9=20Santoni?= Date: Thu, 27 Nov 2014 22:28:45 +0700 Subject: [PATCH 1/2] (XMB) Move all file_list caching actions inside the xmb display driver --- menu/disp/glui.c | 1 + menu/disp/lakka.c | 1 + menu/disp/menu_display.h | 1 + menu/disp/rgui.c | 1 + menu/disp/xmb.c | 27 ++++++++++++++++++++++++++- menu/menu_entries_cbs.c | 20 ++------------------ menu/menu_list.c | 15 +++++---------- 7 files changed, 37 insertions(+), 29 deletions(-) diff --git a/menu/disp/glui.c b/menu/disp/glui.c index 311493b1cc..40b51ab86a 100644 --- a/menu/disp/glui.c +++ b/menu/disp/glui.c @@ -624,6 +624,7 @@ menu_ctx_driver_t menu_ctx_glui = { NULL, NULL, NULL, + NULL, glui_init_core_info, glui_update_core_info, &menu_ctx_backend_common, diff --git a/menu/disp/lakka.c b/menu/disp/lakka.c index 8006947823..ce5b3270fc 100644 --- a/menu/disp/lakka.c +++ b/menu/disp/lakka.c @@ -1338,6 +1338,7 @@ menu_ctx_driver_t menu_ctx_lakka = { NULL, NULL, NULL, + NULL, lakka_init_core_info, lakka_update_core_info, &menu_ctx_backend_lakka, diff --git a/menu/disp/menu_display.h b/menu/disp/menu_display.h index c6a06e9dfb..2ab794200e 100644 --- a/menu/disp/menu_display.h +++ b/menu/disp/menu_display.h @@ -30,6 +30,7 @@ typedef struct menu_ctx_driver void (*list_insert)(void *, const char *, const char *, size_t); void (*list_delete)(void *, size_t, size_t); void (*list_clear)(void *); + void (*list_cache)(bool, unsigned); void (*list_set_selection)(void *); void (*init_core_info)(void *); void (*update_core_info)(void *); diff --git a/menu/disp/rgui.c b/menu/disp/rgui.c index cf7ed393b6..2284bf0dae 100644 --- a/menu/disp/rgui.c +++ b/menu/disp/rgui.c @@ -594,6 +594,7 @@ menu_ctx_driver_t menu_ctx_rgui = { NULL, NULL, NULL, + NULL, rgui_update_core_info, &menu_ctx_backend_common, "rgui", diff --git a/menu/disp/xmb.c b/menu/disp/xmb.c index a3253f4235..b4f031e20b 100644 --- a/menu/disp/xmb.c +++ b/menu/disp/xmb.c @@ -1390,6 +1390,31 @@ static void xmb_list_clear(void *data) (void)data; } +static void xmb_list_cache(bool horizontal, unsigned action) +{ + file_list_copy(driver.menu->menu_list->selection_buf, driver.menu->menu_list->selection_buf_old); + file_list_copy(driver.menu->menu_list->menu_stack, driver.menu->menu_list->menu_stack_old); + driver.menu->selection_ptr_old = driver.menu->selection_ptr; + + if(!horizontal) + return; + + driver.menu->cat_selection_ptr_old = driver.menu->cat_selection_ptr; + driver.menu->cat_selection_ptr += action == MENU_ACTION_LEFT ? -1 : 1; + + size_t stack_size = driver.menu->menu_list->menu_stack->size; + if (driver.menu->cat_selection_ptr == 0) + { + strlcpy(driver.menu->menu_list->menu_stack->list[stack_size-1].label, "Main Menu", PATH_MAX); + driver.menu->menu_list->menu_stack->list[stack_size-1].type = MENU_SETTINGS; + } + else + { + strlcpy(driver.menu->menu_list->menu_stack->list[stack_size-1].label, "Horizontal Menu", PATH_MAX); + driver.menu->menu_list->menu_stack->list[stack_size-1].type = MENU_SETTING_HORIZONTAL_MENU; + } +} + static void xmb_list_set_selection(void *data) { (void)data; @@ -1424,7 +1449,6 @@ static void xmb_context_destroy(void *data) } } - menu_ctx_driver_t menu_ctx_xmb = { NULL, xmb_get_message, @@ -1448,6 +1472,7 @@ menu_ctx_driver_t menu_ctx_xmb = { xmb_list_insert, xmb_list_delete, xmb_list_clear, + xmb_list_cache, xmb_list_set_selection, xmb_init_core_info, xmb_update_core_info, diff --git a/menu/menu_entries_cbs.c b/menu/menu_entries_cbs.c index 93315a0b67..b3bbf42345 100644 --- a/menu/menu_entries_cbs.c +++ b/menu/menu_entries_cbs.c @@ -981,24 +981,8 @@ static int action_toggle_mainmenu(unsigned type, const char *label, switch (push_list) { case 1: - file_list_copy(driver.menu->menu_list->selection_buf, driver.menu->menu_list->selection_buf_old); - file_list_copy(driver.menu->menu_list->menu_stack, driver.menu->menu_list->menu_stack_old); - driver.menu->selection_ptr_old = driver.menu->selection_ptr; - driver.menu->cat_selection_ptr_old = driver.menu->cat_selection_ptr; - driver.menu->cat_selection_ptr += action == MENU_ACTION_LEFT ? -1 : 1; - driver.menu->selection_ptr = 0; - - size_t stack_size = driver.menu->menu_list->menu_stack->size; - if (driver.menu->cat_selection_ptr == 0) - { - strlcpy(driver.menu->menu_list->menu_stack->list[stack_size-1].label, "Main Menu", PATH_MAX); - driver.menu->menu_list->menu_stack->list[stack_size-1].type = MENU_SETTINGS; - } - else - { - strlcpy(driver.menu->menu_list->menu_stack->list[stack_size-1].label, "Horizontal Menu", PATH_MAX); - driver.menu->menu_list->menu_stack->list[stack_size-1].type = MENU_SETTING_HORIZONTAL_MENU; - } + if (driver.menu_ctx->list_cache) + driver.menu_ctx->list_cache(true, action); if (cbs && cbs->action_content_list_switch) return cbs->action_content_list_switch( diff --git a/menu/menu_list.c b/menu/menu_list.c index 3f6afca1bd..8001efde47 100644 --- a/menu/menu_list.c +++ b/menu/menu_list.c @@ -163,11 +163,9 @@ void menu_list_pop_stack(menu_list_t *list) if (file_list_get_size(list->menu_stack) > 1) { -#ifdef HAVE_XMB - file_list_copy(driver.menu->menu_list->selection_buf, driver.menu->menu_list->selection_buf_old); - file_list_copy(driver.menu->menu_list->menu_stack, driver.menu->menu_list->menu_stack_old); - driver.menu->selection_ptr_old = driver.menu->selection_ptr; -#endif + if (driver.menu_ctx->list_cache) + driver.menu_ctx->list_cache(false, 0); + menu_list_pop(list->menu_stack, &driver.menu->selection_ptr); driver.menu->need_refresh = true; } @@ -278,11 +276,8 @@ void menu_list_push_stack_refresh(menu_list_t *list, if (!list) return; -#ifdef HAVE_XMB - file_list_copy(driver.menu->menu_list->selection_buf, driver.menu->menu_list->selection_buf_old); - file_list_copy(driver.menu->menu_list->menu_stack, driver.menu->menu_list->menu_stack_old); - driver.menu->selection_ptr_old = driver.menu->selection_ptr; -#endif + if (driver.menu_ctx->list_cache) + driver.menu_ctx->list_cache(false, 0); menu_list_push_stack(list, path, label, type, directory_ptr); menu_navigation_clear(driver.menu, true); From 01838efaa8124fd2ea7249110bab4d83694cb2d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Andr=C3=A9=20Santoni?= Date: Thu, 27 Nov 2014 23:03:27 +0700 Subject: [PATCH 2/2] (XMB) Move all file_list caching variables to the xmb display driver --- menu/disp/xmb.c | 36 ++++++++++++++++++++++++------------ menu/menu_driver.h | 2 -- menu/menu_list.c | 2 -- menu/menu_list.h | 2 -- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/menu/disp/xmb.c b/menu/disp/xmb.c index b4f031e20b..6bb9491bf2 100644 --- a/menu/disp/xmb.c +++ b/menu/disp/xmb.c @@ -79,6 +79,10 @@ struct xmb_texture_item typedef struct xmb_handle { + file_list_t *menu_stack_old; + file_list_t *selection_buf_old; + size_t cat_selection_ptr_old; + size_t selection_ptr_old; int active_category; int active_category_old; int num_categories; @@ -707,7 +711,7 @@ static void xmb_populate_entries(void *data, const char *path, if (driver.menu->cat_selection_ptr != xmb->active_category_old) { - dir = driver.menu->cat_selection_ptr > driver.menu->cat_selection_ptr_old ? 1 : -1; + dir = driver.menu->cat_selection_ptr > xmb->cat_selection_ptr_old ? 1 : -1; xmb->active_category += dir; @@ -725,8 +729,8 @@ static void xmb_populate_entries(void *data, const char *path, } add_tween(XMB_DELAY, xmb->hspacing*-(float)driver.menu->cat_selection_ptr, &xmb->categories_x, &inOutQuad, NULL); - dir = driver.menu->cat_selection_ptr > driver.menu->cat_selection_ptr_old ? 1 : -1; - xmb_list_switch_old(driver.menu->menu_list->selection_buf_old, dir, driver.menu->selection_ptr_old); + dir = driver.menu->cat_selection_ptr > xmb->cat_selection_ptr_old ? 1 : -1; + xmb_list_switch_old(xmb->selection_buf_old, dir, xmb->selection_ptr_old); xmb_list_switch_new(driver.menu->menu_list->selection_buf, dir, driver.menu->selection_ptr); xmb->active_category_old = driver.menu->cat_selection_ptr; return; @@ -752,7 +756,7 @@ static void xmb_populate_entries(void *data, const char *path, add_tween(XMB_DELAY, ia, &node->alpha, &inOutQuad, NULL); } - xmb_list_open_old(driver.menu->menu_list->selection_buf_old, dir, driver.menu->selection_ptr_old); + xmb_list_open_old(xmb->selection_buf_old, dir, xmb->selection_ptr_old); xmb_list_open_new(driver.menu->menu_list->selection_buf, dir, driver.menu->selection_ptr); if (xmb->depth == 1 || xmb->depth == 2) @@ -954,11 +958,11 @@ static void xmb_frame(void) depth = file_list_get_size(driver.menu->menu_list->menu_stack); xmb_draw_items( - driver.menu->menu_list->selection_buf_old, - driver.menu->menu_list->menu_stack_old, - driver.menu->selection_ptr_old, + xmb->selection_buf_old, + xmb->menu_stack_old, + xmb->selection_ptr_old, depth > 1 ? driver.menu->cat_selection_ptr : - driver.menu->cat_selection_ptr_old); + xmb->cat_selection_ptr_old); xmb_draw_items( driver.menu->menu_list->selection_buf, driver.menu->menu_list->menu_stack, @@ -1061,6 +1065,9 @@ static void *xmb_init(void) xmb = (xmb_handle_t*)menu->userdata; + xmb->menu_stack_old = (file_list_t*)calloc(1, sizeof(file_list_t)); + xmb->selection_buf_old = (file_list_t*)calloc(1, sizeof(file_list_t)); + xmb->active_category = 0; xmb->active_category_old = 0; xmb->x = 0; @@ -1392,14 +1399,19 @@ static void xmb_list_clear(void *data) static void xmb_list_cache(bool horizontal, unsigned action) { - file_list_copy(driver.menu->menu_list->selection_buf, driver.menu->menu_list->selection_buf_old); - file_list_copy(driver.menu->menu_list->menu_stack, driver.menu->menu_list->menu_stack_old); - driver.menu->selection_ptr_old = driver.menu->selection_ptr; + xmb_handle_t *xmb = (xmb_handle_t*)driver.menu->userdata; + + if (!xmb) + return; + + file_list_copy(driver.menu->menu_list->selection_buf, xmb->selection_buf_old); + file_list_copy(driver.menu->menu_list->menu_stack, xmb->menu_stack_old); + xmb->selection_ptr_old = driver.menu->selection_ptr; if(!horizontal) return; - driver.menu->cat_selection_ptr_old = driver.menu->cat_selection_ptr; + xmb->cat_selection_ptr_old = driver.menu->cat_selection_ptr; driver.menu->cat_selection_ptr += action == MENU_ACTION_LEFT ? -1 : 1; size_t stack_size = driver.menu->menu_list->menu_stack->size; diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 831b0aa948..18fe3e817e 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -79,9 +79,7 @@ typedef struct menu_list_t *menu_list; size_t cat_selection_ptr; - size_t cat_selection_ptr_old; size_t selection_ptr; - size_t selection_ptr_old; bool need_refresh; bool msg_force; bool push_start_screen; diff --git a/menu/menu_list.c b/menu/menu_list.c index 8001efde47..e80cc9fcf7 100644 --- a/menu/menu_list.c +++ b/menu/menu_list.c @@ -56,8 +56,6 @@ void *menu_list_new(void) list->menu_stack = (file_list_t*)calloc(1, sizeof(file_list_t)); list->selection_buf = (file_list_t*)calloc(1, sizeof(file_list_t)); - list->menu_stack_old = (file_list_t*)calloc(1, sizeof(file_list_t)); - list->selection_buf_old = (file_list_t*)calloc(1, sizeof(file_list_t)); if (!list->menu_stack || !list->selection_buf) { diff --git a/menu/menu_list.h b/menu/menu_list.h index 523c0d17a6..cb0c679ba6 100644 --- a/menu/menu_list.h +++ b/menu/menu_list.h @@ -26,9 +26,7 @@ extern "C" { typedef struct menu_list { file_list_t *menu_stack; - file_list_t *menu_stack_old; file_list_t *selection_buf; - file_list_t *selection_buf_old; } menu_list_t; void menu_list_free(menu_list_t *menu_list);