diff --git a/driver.h b/driver.h index a24a6d9082..6d96ad3eb3 100644 --- a/driver.h +++ b/driver.h @@ -501,6 +501,10 @@ typedef struct menu_ctx_driver void (*navigation_set_last)(void *); void (*navigation_descend_alphabet)(void *, size_t *); void (*navigation_ascend_alphabet)(void *, size_t *); + void (*list_insert)(void *, const char *, size_t); + void (*list_delete)(void *, size_t); + void (*list_clear)(void *); + void (*list_set_selection)(void *); // Human readable string. const char *ident; diff --git a/frontend/menu/disp/lakka.c b/frontend/menu/disp/lakka.c index 416e9653d7..beb95b3fa5 100644 --- a/frontend/menu/disp/lakka.c +++ b/frontend/menu/disp/lakka.c @@ -732,5 +732,9 @@ const menu_ctx_driver_t menu_ctx_lakka = { NULL, NULL, NULL, + NULL, + NULL, + NULL, + NULL, "lakka", }; diff --git a/frontend/menu/disp/rgui.c b/frontend/menu/disp/rgui.c index 4ddbe2836f..662e9cac77 100644 --- a/frontend/menu/disp/rgui.c +++ b/frontend/menu/disp/rgui.c @@ -624,5 +624,9 @@ const menu_ctx_driver_t menu_ctx_rgui = { NULL, NULL, NULL, + NULL, + NULL, + NULL, + NULL, "rgui", }; diff --git a/frontend/menu/disp/rmenu.c b/frontend/menu/disp/rmenu.c index cc85444287..79ad65d221 100644 --- a/frontend/menu/disp/rmenu.c +++ b/frontend/menu/disp/rmenu.c @@ -485,5 +485,9 @@ const menu_ctx_driver_t menu_ctx_rmenu = { NULL, NULL, NULL, + NULL, + NULL, + NULL, + NULL, "rmenu", }; diff --git a/frontend/menu/disp/rmenu_xui.cpp b/frontend/menu/disp/rmenu_xui.cpp index 4578ca360d..d869f6c4a3 100644 --- a/frontend/menu/disp/rmenu_xui.cpp +++ b/frontend/menu/disp/rmenu_xui.cpp @@ -674,6 +674,34 @@ static void rmenu_xui_navigation_alphabet(void *data, size_t *ptr_out) XuiListSetCurSelVisible(m_menulist, *ptr_out); } +static void rmenu_xui_list_insert(void *data, const char *path, size_t list_size) +{ + (void)data; + wchar_t buf[PATH_MAX]; + + XuiListInsertItems(m_menulist, list_size, 1); + mbstowcs(buf, path, sizeof(buf) / sizeof(wchar_t)); + XuiListSetText(m_menulist, list_size, buf); +} + +static void rmenu_xui_list_delete(void *data, size_t list_size) +{ + (void)data; + XuiListDeleteItems(m_menulist, 0, list_size); +} + +static void rmenu_xui_list_clear(void *data) +{ + (void)data; + XuiListDeleteItems(m_menulist, 0, XuiListGetItemCount(m_menulist)); +} + +static void rmenu_xui_list_set_selection(void *data) +{ + file_list_t *list = (file_list_t*)data; + XuiListSetCurSel(m_menulist, list->list[list->size].directory_ptr); +} + const menu_ctx_driver_t menu_ctx_rmenu_xui = { NULL, rmenu_xui_render_messagebox, @@ -693,5 +721,9 @@ const menu_ctx_driver_t menu_ctx_rmenu_xui = { rmenu_xui_navigation_set_visible, rmenu_xui_navigation_alphabet, rmenu_xui_navigation_alphabet, + rmenu_xui_list_insert, + rmenu_xui_list_delete, + rmenu_xui_list_clear, + rmenu_xui_list_set_selection, "rmenu_xui", }; diff --git a/frontend/menu/file_list.c b/frontend/menu/file_list.c index b08c1e4865..699f206780 100644 --- a/frontend/menu/file_list.c +++ b/frontend/menu/file_list.c @@ -17,11 +17,9 @@ #include #include #include "file_list.h" +#include "../../driver.h" #include "../../compat/strcasestr.h" #include "../../msvc/msvc_compat.h" -#ifdef HAVE_RMENU_XUI -#include -#endif struct item_file { @@ -31,10 +29,6 @@ struct item_file size_t directory_ptr; }; -#ifdef HAVE_RMENU_XUI -extern HXUIOBJ m_menulist; -#endif - void file_list_push(file_list_t *list, const char *path, unsigned type, size_t directory_ptr) { @@ -48,12 +42,8 @@ void file_list_push(file_list_t *list, list->list = (struct item_file*)realloc(list->list, list->capacity * sizeof(struct item_file)); } -#ifdef HAVE_RMENU_XUI - wchar_t buf[PATH_MAX]; - XuiListInsertItems(m_menulist, list->size, 1); - mbstowcs(buf, path, sizeof(buf) / sizeof(wchar_t)); - XuiListSetText(m_menulist, list->size, buf); -#endif + if (driver.menu_ctx && driver.menu_ctx->list_insert) + driver.menu_ctx->list_insert(list, path, list->size); list->list[list->size].path = strdup(path); list->list[list->size].alt = NULL; @@ -67,9 +57,8 @@ void file_list_pop(file_list_t *list, size_t *directory_ptr) { if (!(list->size == 0)) { -#ifdef HAVE_RMENU_XUI - XuiListDeleteItems(m_menulist, 0, list->size); -#endif + if (driver.menu_ctx && driver.menu_ctx->list_delete) + driver.menu_ctx->list_delete(list, list->size); free(list->list[--list->size].path); } @@ -77,9 +66,9 @@ void file_list_pop(file_list_t *list, size_t *directory_ptr) { *directory_ptr = list->list[list->size].directory_ptr; } -#ifdef HAVE_RMENU_XUI - XuiListSetCurSel(m_menulist, list->list[list->size].directory_ptr); -#endif + + if (driver.menu_ctx && driver.menu_ctx->list_set_selection) + driver.menu_ctx->list_set_selection(list); } void file_list_free(file_list_t *list) @@ -99,9 +88,9 @@ void file_list_clear(file_list_t *list) free(list->list[i].path); free(list->list[i].alt); } -#ifdef HAVE_RMENU_XUI - XuiListDeleteItems(m_menulist, 0, XuiListGetItemCount(m_menulist)); -#endif + + if (driver.menu_ctx && driver.menu_ctx->list_clear) + driver.menu_ctx->list_clear(list); list->size = 0; }