From 069a9cbfe636cd9f89fdc56c3a7cf851dbb144b4 Mon Sep 17 00:00:00 2001 From: Ghost Coder Date: Wed, 17 Aug 2016 11:28:42 -0500 Subject: [PATCH] Reworked xmb driver to allow tab hiding --- Makefile.common | 6 + configuration.c | 45 +++++ configuration.h | 17 ++ intl/msg_hash_us.c | 52 ++++++ menu/cbs/menu_cbs_get_value.c | 193 ++++++++++++++++++++ menu/drivers/xmb.c | 332 ++++++++++++++++++++++++++++------ menu/menu_display.h | 15 ++ menu/menu_displaylist.c | 102 ++++++++--- menu/menu_setting.c | 115 ++++++++++++ msg_hash.h | 38 ++++ 10 files changed, 837 insertions(+), 78 deletions(-) diff --git a/Makefile.common b/Makefile.common index 8f2cda482c..2cca828cf1 100644 --- a/Makefile.common +++ b/Makefile.common @@ -481,6 +481,12 @@ endif ifeq ($(HAVE_XMB), 1) OBJ += menu/drivers/xmb.o DEFINES += -DHAVE_XMB +ifeq ($(HAVE_XMB_REQUIRESETTINGS), 1) + DEFINES += -DHAVE_XMB_REQUIRESETTINGS +endif +endif +ifeq ($(HAVE_KIOSK), 1) + DEFINES += -DHAVE_KIOSK endif endif diff --git a/configuration.c b/configuration.c index d35a92e39b..cc609da4cd 100644 --- a/configuration.c +++ b/configuration.c @@ -496,6 +496,21 @@ static void config_set_defaults(void) settings->menu.xmb.shadows_enable = xmb_shadows_enable; settings->menu.xmb.shader_pipeline = menu_shader_pipeline; settings->menu.xmb.font[0] = '\0'; +#ifdef HAVE_KIOSK + settings->menu.xmb.node_position_main = XMB_NODE_POSITION_NORMAL; +#endif + settings->menu.xmb.node_position_settings = XMB_NODE_POSITION_NORMAL; +#ifdef HAVE_IMAGEVIEWER + settings->menu.xmb.node_position_images = XMB_NODE_POSITION_NORMAL; +#endif +#ifdef HAVE_FFMPEG + settings->menu.xmb.node_position_music = XMB_NODE_POSITION_NORMAL; + settings->menu.xmb.node_position_video = XMB_NODE_POSITION_NORMAL; +#endif + settings->menu.xmb.node_position_history = XMB_NODE_POSITION_NORMAL; +#ifdef HAVE_LIBRETRODB + settings->menu.xmb.node_position_add = XMB_NODE_POSITION_NORMAL; +#endif #endif #ifdef HAVE_MATERIALUI settings->menu.materialui.menu_color_theme = MATERIALUI_THEME_BLUE; @@ -1440,6 +1455,21 @@ static bool config_load_file(const char *path, bool set_defaults) { "xmb_theme", &settings->menu.xmb.theme}, #ifdef HAVE_XMB { "xmb_menu_color_theme", &settings->menu.xmb.menu_color_theme}, +#ifdef HAVE_KIOSK + { "xmb_node_position_main", &settings->menu.xmb.node_position_main}, +#endif + { "xmb_node_position_settings", &settings->menu.xmb.node_position_settings}, +#ifdef HAVE_IMAGEVIEWER + { "xmb_node_position_images", &settings->menu.xmb.node_position_images}, +#endif +#ifdef HAVE_FFMPEG + { "xmb_node_position_music", &settings->menu.xmb.node_position_music}, + { "xmb_node_position_video", &settings->menu.xmb.node_position_video}, +#endif + { "xmb_node_position_history", &settings->menu.xmb.node_position_history}, +#ifdef HAVE_LIBRETRODB + { "xmb_node_position_add", &settings->menu.xmb.node_position_add}, +#endif #endif { "materialui_menu_color_theme", &settings->menu.materialui.menu_color_theme}, { "menu_shader_pipeline", &settings->menu.xmb.shader_pipeline}, @@ -2944,6 +2974,21 @@ bool config_save_file(const char *path) { "xmb_theme", settings->menu.xmb.theme}, #ifdef HAVE_XMB { "xmb_menu_color_theme", settings->menu.xmb.menu_color_theme}, +#ifdef HAVE_KIOSK + { "xmb_node_position_main", settings->menu.xmb.node_position_main}, +#endif + { "xmb_node_position_settings", settings->menu.xmb.node_position_settings}, +#ifdef HAVE_IMAGEVIEWER + { "xmb_node_position_images", settings->menu.xmb.node_position_images}, +#endif +#ifdef HAVE_FFMPEG + { "xmb_node_position_music", settings->menu.xmb.node_position_music}, + { "xmb_node_position_video", settings->menu.xmb.node_position_video}, +#endif + { "xmb_node_position_history", settings->menu.xmb.node_position_history}, +#ifdef HAVE_LIBRETRODB + { "xmb_node_position_add", settings->menu.xmb.node_position_add}, +#endif #endif { "materialui_menu_color_theme", settings->menu.materialui.menu_color_theme}, { "menu_shader_pipeline", settings->menu.xmb.shader_pipeline}, diff --git a/configuration.h b/configuration.h index 7da2f0d0af..9df3601c95 100644 --- a/configuration.h +++ b/configuration.h @@ -233,6 +233,23 @@ typedef struct settings unsigned alpha_factor; unsigned theme; unsigned menu_color_theme; +#ifdef HAVE_XMB +#ifdef HAVE_KIOSK + unsigned node_position_main; +#endif + unsigned node_position_settings; +#ifdef HAVE_IMAGEVIEWER + unsigned node_position_images; +#endif +#ifdef HAVE_FFMPEG + unsigned node_position_music; + unsigned node_position_video; +#endif + unsigned node_position_history; +#ifdef HAVE_LIBRETRODB + unsigned node_position_add; +#endif +#endif bool shadows_enable; } xmb; diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 7e1208516a..a780b8d3f8 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -2420,6 +2420,30 @@ static const char *menu_hash_to_str_us_label_enum(enum msg_hash_enums msg) return "xmb_theme"; case MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME: return "xmb_menu_color_theme"; +#ifdef HAVE_XMB +#ifdef HAVE_KIOSK + case MENU_ENUM_LABEL_XMB_NODE_POSITION_MAIN: + return "xmb_node_position_main"; +#endif + case MENU_ENUM_LABEL_XMB_NODE_POSITION_SETTINGS: + return "xmb_node_position_settings"; +#ifdef HAVE_IMAGEVIEWER + case MENU_ENUM_LABEL_XMB_NODE_POSITION_IMAGES: + return "xmb_node_position_images"; +#endif +#ifdef HAVE_FFMPEG + case MENU_ENUM_LABEL_XMB_NODE_POSITION_MUSIC: + return "xmb_node_position_music"; + case MENU_ENUM_LABEL_XMB_NODE_POSITION_VIDEO: + return "xmb_node_position_video"; +#endif + case MENU_ENUM_LABEL_XMB_NODE_POSITION_HISTORY: + return "xmb_node_position_history"; +#ifdef HAVE_LIBRETRODB + case MENU_ENUM_LABEL_XMB_NODE_POSITION_ADD: + return "xmb_node_position_add"; +#endif +#endif case MENU_ENUM_LABEL_MATERIALUI_MENU_COLOR_THEME: return "materialui_menu_color_theme"; case MENU_ENUM_LABEL_MATERIALUI_MENU_HEADER_OPACITY: @@ -2949,6 +2973,10 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg) return "Volcanic Red"; case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK: return "Dark"; +#ifdef HAVE_XMB + case MENU_ENUM_LABEL_VALUE_XMB_MENU_NODE_POSITION_REORDERED: + return "REORDERED"; +#endif case MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY: return "Unlocked"; case MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY: @@ -3711,6 +3739,30 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg) return "Menu Icon Theme"; case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME: return "Menu Color Theme"; +#ifdef HAVE_XMB +#ifdef HAVE_KIOSK + case MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_MAIN: + return "Show Main Menu"; +#endif + case MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_SETTINGS: + return "Show Settings Menu"; +#ifdef HAVE_IMAGEVIEWER + case MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_IMAGES: + return "Show Images Menu"; +#endif +#ifdef HAVE_FFMPEG + case MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_MUSIC: + return "Show Music Menu"; + case MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_VIDEO: + return "Show Video Menu"; +#endif + case MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_HISTORY: + return "Show History Menu"; +#ifdef HAVE_LIBRETRODB + case MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_ADD: + return "Show Import Menu"; +#endif +#endif case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME: return "Menu Color Theme"; case MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE: diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index b64464becb..b325f09744 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -783,6 +783,165 @@ static void menu_action_setting_disp_set_label_xmb_menu_color_theme( } } +#ifdef HAVE_XMB +#ifndef HAVE_KIOSK +static void menu_action_setting_disp_set_label_xmb_menu_node_position( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2, unsigned position) +{ + strlcpy(s2, path, len2); + *w = 7; + + switch (position) + { + case XMB_NODE_POSITION_HIDDEN: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_OFF), + len); + break; + case XMB_NODE_POSITION_NORMAL: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_ON), + len); + break; + default: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_XMB_MENU_NODE_POSITION_REORDERED), + len); + break; + } +} + +static void menu_action_setting_disp_set_label_xmb_menu_node_position_settings( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + settings_t *settings = config_get_ptr(); + + if (!settings) + return; + + menu_action_setting_disp_set_label_xmb_menu_node_position(list, + w, type, i, label, s, len, entry_label, path, s2, len2, + settings->menu.xmb.node_position_settings); +} + +#ifdef HAVE_IMAGEVIEWER +static void menu_action_setting_disp_set_label_xmb_menu_node_position_images( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + settings_t *settings = config_get_ptr(); + + if (!settings) + return; + + menu_action_setting_disp_set_label_xmb_menu_node_position(list, + w, type, i, label, s, len, entry_label, path, s2, len2, + settings->menu.xmb.node_position_images); +} +#endif + +#ifdef HAVE_FFMPEG +static void menu_action_setting_disp_set_label_xmb_menu_node_position_music( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + settings_t *settings = config_get_ptr(); + + if (!settings) + return; + + menu_action_setting_disp_set_label_xmb_menu_node_position(list, + w, type, i, label, s, len, entry_label, path, s2, len2, + settings->menu.xmb.node_position_music); +} + +static void menu_action_setting_disp_set_label_xmb_menu_node_position_video( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + settings_t *settings = config_get_ptr(); + + if (!settings) + return; + + menu_action_setting_disp_set_label_xmb_menu_node_position(list, + w, type, i, label, s, len, entry_label, path, s2, len2, + settings->menu.xmb.node_position_video); +} +#endif + +static void menu_action_setting_disp_set_label_xmb_menu_node_position_history( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + settings_t *settings = config_get_ptr(); + + if (!settings) + return; + + menu_action_setting_disp_set_label_xmb_menu_node_position(list, + w, type, i, label, s, len, entry_label, path, s2, len2, + settings->menu.xmb.node_position_history); +} + +#ifdef HAVE_LIBRETRODB +static void menu_action_setting_disp_set_label_xmb_menu_node_position_add( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + settings_t *settings = config_get_ptr(); + + if (!settings) + return; + + menu_action_setting_disp_set_label_xmb_menu_node_position(list, + w, type, i, label, s, len, entry_label, path, s2, len2, + settings->menu.xmb.node_position_add); +} +#endif +#endif +#endif + static void menu_action_setting_disp_set_label_materialui_menu_color_theme( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -1532,6 +1691,40 @@ static int menu_cbs_init_bind_get_string_representation_compare_label( BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_xmb_menu_color_theme); break; +#ifdef HAVE_XMB +#ifndef HAVE_KIOSK + case MENU_ENUM_LABEL_XMB_NODE_POSITION_SETTINGS: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_xmb_menu_node_position_settings); + break; +#ifdef HAVE_IMAGEVIEWER + case MENU_ENUM_LABEL_XMB_NODE_POSITION_IMAGES: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_xmb_menu_node_position_images); + break; +#endif +#ifdef HAVE_FFMPEG + case MENU_ENUM_LABEL_XMB_NODE_POSITION_MUSIC: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_xmb_menu_node_position_music); + break; + case MENU_ENUM_LABEL_XMB_NODE_POSITION_VIDEO: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_xmb_menu_node_position_video); + break; +#endif + case MENU_ENUM_LABEL_XMB_NODE_POSITION_HISTORY: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_xmb_menu_node_position_history); + break; +#ifdef HAVE_LIBRETRODB + case MENU_ENUM_LABEL_XMB_NODE_POSITION_ADD: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_xmb_menu_node_position_add); + break; +#endif +#endif +#endif case MENU_ENUM_LABEL_MATERIALUI_MENU_COLOR_THEME: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_materialui_menu_color_theme); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 29abcdfd6a..d3f31a4db0 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -107,6 +107,7 @@ enum XMB_TEXTURE_CURSOR, XMB_TEXTURE_SWITCH_ON, XMB_TEXTURE_SWITCH_OFF, + XMB_TEXTURE_SWITCH_REORDERED, XMB_TEXTURE_CLOCK, XMB_TEXTURE_POINTER, XMB_TEXTURE_ADD, @@ -134,6 +135,13 @@ enum #define XMB_SYSTEM_TAB_END XMB_SYSTEM_TAB_HISTORY #endif +enum +{ + XMB_PLAYLIST_DIFFERENCE = XMB_SYSTEM_TAB_END + 1, + XMB_PLAYLIST_LEFT, + XMB_PLAYLIST_RIGHT +}; + typedef struct xmb_handle { file_list_t *menu_stack_old; @@ -263,9 +271,17 @@ typedef struct xmb_handle xmb_node_t history_tab_node; xmb_node_t add_tab_node; + unsigned tab_positions[XMB_PLAYLIST_RIGHT + 1]; + video_font_raster_block_t raster_block; } xmb_handle_t; +typedef struct xmb_tab_position_key +{ + unsigned internal; + unsigned configured; +} xmb_tab_position_key_t; + float gradient_dark_purple[16] = { 20/255.0, 13/255.0, 20/255.0, 1.0, 20/255.0, 13/255.0, 20/255.0, 1.0, @@ -424,7 +440,7 @@ static size_t xmb_list_get_size(void *data, enum menu_list_type type) return file_list_get_size(xmb->horizontal_list); break; case MENU_LIST_TABS: - return XMB_SYSTEM_TAB_END; + return xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE]; } return 0; @@ -448,6 +464,7 @@ static void *xmb_list_get_entry(void *data, enum menu_list_type type, unsigned i case MENU_LIST_HORIZONTAL: if (xmb && xmb->horizontal_list) list_size = file_list_get_size(xmb->horizontal_list); + i += 1 + xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE] - xmb->tab_positions[XMB_PLAYLIST_LEFT]; if (i < list_size) return (void*)&xmb->horizontal_list->list[i]; break; @@ -997,7 +1014,7 @@ static xmb_node_t *xmb_node_allocate_userdata(xmb_handle_t *xmb, unsigned i) node->alpha = xmb->categories.passive.alpha; node->zoom = xmb->categories.passive.zoom; - if ((i + XMB_SYSTEM_TAB_END) == xmb->categories.active.idx) + if ((i + xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE]) == xmb->categories.active.idx) { node->alpha = xmb->categories.active.alpha; node->zoom = xmb->categories.active.zoom; @@ -1125,7 +1142,8 @@ static void xmb_list_switch_new(xmb_handle_t *xmb, static void xmb_set_title(xmb_handle_t *xmb) { - if (xmb->categories.selection_ptr <= XMB_SYSTEM_TAB_END) + if (xmb->categories.selection_ptr < xmb->tab_positions[XMB_PLAYLIST_LEFT] + || xmb->categories.selection_ptr > xmb->tab_positions[XMB_PLAYLIST_RIGHT]) { menu_entries_get_title(xmb->title_name, sizeof(xmb->title_name)); } @@ -1134,7 +1152,7 @@ static void xmb_set_title(xmb_handle_t *xmb) const char *path = NULL; menu_entries_get_at_offset( xmb->horizontal_list, - xmb->categories.selection_ptr - (XMB_SYSTEM_TAB_END + 1), + xmb->categories.selection_ptr - xmb->tab_positions[XMB_PLAYLIST_LEFT], &path, NULL, NULL, NULL, NULL); if (!path) @@ -1144,10 +1162,38 @@ static void xmb_set_title(xmb_handle_t *xmb) } } +static unsigned xmb_get_system_tab(xmb_handle_t *xmb, unsigned i) +{ + /* transform global index into the internal index */ + if (i == xmb->tab_positions[XMB_SYSTEM_TAB_MAIN]) + return XMB_SYSTEM_TAB_MAIN; + else if (i == xmb->tab_positions[XMB_SYSTEM_TAB_SETTINGS]) + return XMB_SYSTEM_TAB_SETTINGS; +#ifdef HAVE_IMAGEVIEWER + else if (i == xmb->tab_positions[XMB_SYSTEM_TAB_IMAGES]) + return XMB_SYSTEM_TAB_IMAGES; +#endif +#ifdef HAVE_FFMPEG + else if (i == xmb->tab_positions[XMB_SYSTEM_TAB_VIDEO]) + return XMB_SYSTEM_TAB_VIDEO; + else if (i == xmb->tab_positions[XMB_SYSTEM_TAB_MUSIC]) + return XMB_SYSTEM_TAB_MUSIC; +#endif + else if (i == xmb->tab_positions[XMB_SYSTEM_TAB_HISTORY]) + return XMB_SYSTEM_TAB_HISTORY; + else if (i == xmb->tab_positions[XMB_SYSTEM_TAB_ADD]) + return XMB_SYSTEM_TAB_ADD; + else + return UINT_MAX; + return UINT_MAX; +} + static xmb_node_t* xmb_get_node(xmb_handle_t *xmb, unsigned i) { - switch (i) + switch (xmb_get_system_tab(xmb, i)) { + case XMB_SYSTEM_TAB_MAIN: + return &xmb->main_menu_node; case XMB_SYSTEM_TAB_SETTINGS: return &xmb->settings_tab_node; #ifdef HAVE_IMAGEVIEWER @@ -1165,9 +1211,10 @@ static xmb_node_t* xmb_get_node(xmb_handle_t *xmb, unsigned i) case XMB_SYSTEM_TAB_ADD: return &xmb->add_tab_node; default: - if (i > XMB_SYSTEM_TAB_END) + if (i >= xmb->tab_positions[XMB_PLAYLIST_LEFT] + && i <= xmb->tab_positions[XMB_PLAYLIST_RIGHT]) return xmb_get_userdata_from_horizontal_list( - xmb, i - (XMB_SYSTEM_TAB_END + 1)); + xmb, i - xmb->tab_positions[XMB_PLAYLIST_LEFT]); } return &xmb->main_menu_node; @@ -1177,9 +1224,9 @@ static void xmb_list_switch_horizontal_list(xmb_handle_t *xmb) { unsigned j; size_t list_size = xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) - + XMB_SYSTEM_TAB_END; + + xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE]; - for (j = 0; j <= list_size; j++) + for (j = 0; j < list_size; j++) { menu_animation_ctx_entry_t entry; float ia = xmb->categories.passive.alpha; @@ -1257,9 +1304,9 @@ static void xmb_list_open_horizontal_list(xmb_handle_t *xmb) { unsigned j; size_t list_size = xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) - + XMB_SYSTEM_TAB_END; + + xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE]; - for (j = 0; j <= list_size; j++) + for (j = 0; j < list_size; j++) { menu_animation_ctx_entry_t entry; float ia = 0; @@ -1308,6 +1355,150 @@ static void xmb_context_destroy_horizontal_list(xmb_handle_t *xmb) } } +static int xmb_sort_tab_position(const xmb_tab_position_key_t *a, + const xmb_tab_position_key_t *b) +{ + if (a->configured == b->configured) + return a->internal - b->internal; + return a->configured - b->configured; +} + +static void xmb_init_tab_positions(xmb_handle_t *xmb, settings_t *settings) +{ + unsigned configured_position_main = XMB_NODE_POSITION_NORMAL; + unsigned configured_position_settings = settings->menu.xmb.node_position_settings; +#ifdef HAVE_IMAGEVIEWER + unsigned configured_position_images = settings->menu.xmb.node_position_images; +#endif +#ifdef HAVE_FFMPEG + unsigned configured_position_music = settings->menu.xmb.node_position_music; + unsigned configured_position_video = settings->menu.xmb.node_position_video; +#endif + unsigned configured_position_history = settings->menu.xmb.node_position_history; +#ifdef HAVE_LIBRETRODB + unsigned configured_position_add = settings->menu.xmb.node_position_add; +#endif + size_t list_size = file_list_get_size(xmb->horizontal_list); + unsigned i = 0; + + /* adjust the configured positions for the needs of some distributions */ +#ifdef HAVE_KIOSK + /* configured_position_main = settings->menu.xmb.node_position_main; */ +#endif +#if defined(HAVE_XMB_REQUIRESETTINGS) && !defined(HAVE_KIOSK) + if (configured_position_settings == XMB_NODE_POSITION_HIDDEN) + configured_position_settings = XMB_NODE_POSITION_NORMAL; +#endif + + /* adjust the configured positions depending on history */ + if (settings->history_list_enable) + { + if ( configured_position_history == XMB_NODE_POSITION_HIDDEN +#ifdef HAVE_IMAGEVIEWER + && configured_position_images == XMB_NODE_POSITION_HIDDEN +#endif +#ifdef HAVE_FFMPEG + && configured_position_music == XMB_NODE_POSITION_HIDDEN + && configured_position_video == XMB_NODE_POSITION_HIDDEN +#endif + ) + { + /* reset history tabs if history is enabled without any way to see the history */ + configured_position_history = XMB_NODE_POSITION_NORMAL; + settings->menu.xmb.node_position_history = configured_position_history; +#ifdef HAVE_IMAGEVIEWER + configured_position_images = XMB_NODE_POSITION_NORMAL; + settings->menu.xmb.node_position_images = configured_position_images; +#endif +#ifdef HAVE_FFMPEG + configured_position_music = XMB_NODE_POSITION_NORMAL; + settings->menu.xmb.node_position_music = configured_position_music; + configured_position_video = XMB_NODE_POSITION_NORMAL; + settings->menu.xmb.node_position_video = configured_position_video; +#endif +#ifndef HAVE_KIOSK + command_event(CMD_EVENT_MENU_SAVE_CURRENT_CONFIG, NULL); +#endif + } + } + else + { + if ( configured_position_history != XMB_NODE_POSITION_HIDDEN +#ifdef HAVE_IMAGEVIEWER + || configured_position_images != XMB_NODE_POSITION_HIDDEN +#endif +#ifdef HAVE_FFMPEG + || configured_position_music != XMB_NODE_POSITION_HIDDEN + || configured_position_video != XMB_NODE_POSITION_HIDDEN +#endif + ) + { + /* enable history if any tabs are history shown */ + settings->history_list_enable = true; + if (!settings->content_history_size) + settings->content_history_size = 1; + command_event(CMD_EVENT_HISTORY_INIT, NULL); +#ifndef HAVE_KIOSK + command_event(CMD_EVENT_MENU_SAVE_CURRENT_CONFIG, NULL); +#endif + } + } + + xmb_tab_position_key_t keys[XMB_SYSTEM_TAB_END + 1] = { +#ifdef HAVE_IMAGEVIEWER + {XMB_SYSTEM_TAB_IMAGES, configured_position_images}, +#endif +#ifdef HAVE_FFMPEG + {XMB_SYSTEM_TAB_MUSIC, configured_position_music}, + {XMB_SYSTEM_TAB_VIDEO, configured_position_video}, +#endif +#ifdef HAVE_LIBRETRODB + {XMB_SYSTEM_TAB_ADD, configured_position_add}, +#endif + {XMB_SYSTEM_TAB_MAIN, configured_position_main}, + {XMB_SYSTEM_TAB_SETTINGS, configured_position_settings}, + {XMB_SYSTEM_TAB_HISTORY, configured_position_history} + }; + + qsort(&keys, ARRAY_SIZE(keys), + sizeof(*keys), + (int (*)(const void *, const void *))xmb_sort_tab_position); + + /* discard hidden tabs */ + for (i = 0; i < ARRAY_SIZE(keys) && keys[i].configured == XMB_NODE_POSITION_HIDDEN; i++) + { + xmb->tab_positions[keys[i].internal] = UINT_MAX; + } + + /* close any gaps pushing leftmost using the now sorted keys */ + for (; i < ARRAY_SIZE(keys) && keys[i].configured < XMB_NODE_POSITION_RIGHT; i++) + { + xmb->tab_positions[keys[i].internal] = xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE]++; + xmb->tab_positions[XMB_PLAYLIST_LEFT] += 1; + } + for (; i < ARRAY_SIZE(keys) && keys[i].configured >= XMB_NODE_POSITION_RIGHT; i++) + { + xmb->tab_positions[keys[i].internal] = list_size + xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE]++; + xmb->tab_positions[XMB_PLAYLIST_RIGHT] += 1; + } + + /* adjust playlist limits */ + if (list_size) + xmb->tab_positions[XMB_PLAYLIST_RIGHT] = xmb->tab_positions[XMB_PLAYLIST_LEFT] + list_size - 1; + else + { + xmb->tab_positions[XMB_PLAYLIST_LEFT] += xmb->tab_positions[XMB_PLAYLIST_RIGHT]; + xmb->tab_positions[XMB_PLAYLIST_RIGHT] = 0; + if (!xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE]) + { + /* reset main to guarantee at least one menu can be shown */ + xmb->tab_positions[XMB_SYSTEM_TAB_MAIN] = 0; + xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE] = 1; + xmb->tab_positions[XMB_PLAYLIST_LEFT] = 1; + } + } +} + static void xmb_init_horizontal_list(xmb_handle_t *xmb) { menu_displaylist_info_t info = {0}; @@ -1333,16 +1524,19 @@ static void xmb_init_horizontal_list(xmb_handle_t *xmb) strlcpy(info.exts, "lpl", sizeof(info.exts)); if (menu_displaylist_ctl(DISPLAYLIST_DATABASE_PLAYLISTS_HORIZONTAL, &info)) + { + xmb_init_tab_positions(xmb, settings); menu_displaylist_ctl(DISPLAYLIST_PROCESS, &info); + } } static void xmb_toggle_horizontal_list(xmb_handle_t *xmb) { unsigned i; size_t list_size = xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) - + XMB_SYSTEM_TAB_END; + + xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE]; - for (i = 0; i <= list_size; i++) + for (i = 0; i < list_size; i++) { xmb_node_t *node = xmb_get_node(xmb, i); @@ -1608,7 +1802,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, return core_node->content_icon; #if defined(HAVE_IMAGEVIEWER) || defined(HAVE_FFMPEG) - switch (xmb->categories.selection_ptr) + switch (xmb_get_system_tab(xmb, xmb->categories.selection_ptr)) { #ifdef HAVE_IMAGEVIEWER case XMB_SYSTEM_TAB_IMAGES: @@ -1694,9 +1888,10 @@ static void xmb_draw_items(xmb_handle_t *xmb, if (!list || !list->size) return; - if (cat_selection_ptr > XMB_SYSTEM_TAB_END) + if (cat_selection_ptr >= xmb->tab_positions[XMB_PLAYLIST_LEFT] + && cat_selection_ptr <= xmb->tab_positions[XMB_PLAYLIST_RIGHT]) core_node = xmb_get_userdata_from_horizontal_list( - xmb, cat_selection_ptr - (XMB_SYSTEM_TAB_END + 1)); + xmb, cat_selection_ptr - xmb->tab_positions[XMB_PLAYLIST_LEFT]); end = file_list_get_size(list); @@ -1757,7 +1952,8 @@ static void xmb_draw_items(xmb_handle_t *xmb, if (string_is_equal(entry.value, "disabled") || - string_is_equal(entry.value, "off")) + string_is_equal(entry.value, "off") || + string_is_equal(entry.value, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) { if (xmb->textures.list[XMB_TEXTURE_SWITCH_OFF]) texture_switch = xmb->textures.list[XMB_TEXTURE_SWITCH_OFF]; @@ -1765,13 +1961,22 @@ static void xmb_draw_items(xmb_handle_t *xmb, do_draw_text = true; } else if (string_is_equal(entry.value, "enabled") || - string_is_equal(entry.value, "on")) + string_is_equal(entry.value, "on") || + string_is_equal(entry.value, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ON))) { if (xmb->textures.list[XMB_TEXTURE_SWITCH_ON]) texture_switch = xmb->textures.list[XMB_TEXTURE_SWITCH_ON]; else do_draw_text = true; } + else if (string_is_equal(entry.value, "reordered_tab") || + string_is_equal(entry.value, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_MENU_NODE_POSITION_REORDERED))) + { + if (xmb->textures.list[XMB_TEXTURE_SWITCH_REORDERED]) + texture_switch = xmb->textures.list[XMB_TEXTURE_SWITCH_REORDERED]; + else + do_draw_text = true; + } else { switch (msg_hash_to_file_type(msg_hash_calculate(entry.value))) @@ -2227,8 +2432,8 @@ static void xmb_frame(void *data) menu_display_blend_begin(); /* Horizontal tab icons */ - for (i = 0; i <= xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) - + XMB_SYSTEM_TAB_END; i++) + for (i = 0; i < xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) + + xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE]; i++) { xmb_node_t *node = xmb_get_node(xmb, i); @@ -2781,6 +2986,8 @@ static const char *xmb_texture_path(unsigned id) return "on.png"; case XMB_TEXTURE_SWITCH_OFF: return "off.png"; + case XMB_TEXTURE_SWITCH_REORDERED: + return "reordered.png"; case XMB_TEXTURE_ADD: return "add.png"; } @@ -3043,7 +3250,7 @@ static void xmb_list_cache(void *data, enum menu_list_type type, unsigned action xmb->selection_ptr_old = selection; list_size = xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) - + XMB_SYSTEM_TAB_END; + + xmb->tab_positions[XMB_PLAYLIST_DIFFERENCE]; switch (type) { @@ -3057,14 +3264,14 @@ static void xmb_list_cache(void *data, enum menu_list_type type, unsigned action case MENU_ACTION_LEFT: if (xmb->categories.selection_ptr == 0) { - xmb->categories.selection_ptr = list_size; - xmb->categories.active.idx = list_size - 1; + xmb->categories.selection_ptr = list_size - 1; + xmb->categories.active.idx = list_size - 2; } else xmb->categories.selection_ptr--; break; default: - if (xmb->categories.selection_ptr == list_size) + if (xmb->categories.selection_ptr == (list_size - 1)) { xmb->categories.selection_ptr = 0; xmb->categories.active.idx = 1; @@ -3080,7 +3287,7 @@ static void xmb_list_cache(void *data, enum menu_list_type type, unsigned action free(menu_stack->list[stack_size - 1].label); menu_stack->list[stack_size - 1].label = NULL; - switch (xmb->categories.selection_ptr) + switch (xmb_get_system_tab(xmb, xmb->categories.selection_ptr)) { case XMB_SYSTEM_TAB_MAIN: menu_stack->list[stack_size - 1].label = @@ -3236,6 +3443,10 @@ static int xmb_list_push(void *data, void *userdata, menu_displaylist_ctx_parse_entry_t entry; int ret = -1; menu_handle_t *menu = (menu_handle_t*)data; +#ifdef HAVE_KIOSK + bool hide_entries = false; + settings_t *settings; +#endif switch (type) { @@ -3247,55 +3458,74 @@ static int xmb_list_push(void *data, void *userdata, entry.parse_type = PARSE_ACTION; entry.add_empty_entry = false; +#ifdef HAVE_KIOSK + settings = config_get_ptr(); + + if (settings->menu.xmb.node_position_main == XMB_NODE_POSITION_HIDDEN) + hide_entries = true; +#endif + if (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) { entry.enum_idx = MENU_ENUM_LABEL_CONTENT_SETTINGS; menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); } - if (menu_driver_ctl(RARCH_MENU_CTL_HAS_LOAD_NO_CONTENT, NULL)) +#ifdef HAVE_KIOSK + if (!hide_entries) +#endif { - entry.enum_idx = MENU_ENUM_LABEL_START_CORE; + if (menu_driver_ctl(RARCH_MENU_CTL_HAS_LOAD_NO_CONTENT, NULL)) + { + entry.enum_idx = MENU_ENUM_LABEL_START_CORE; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); + } + + entry.enum_idx = MENU_ENUM_LABEL_START_VIDEO_PROCESSOR; menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); - } - entry.enum_idx = MENU_ENUM_LABEL_START_VIDEO_PROCESSOR; - menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); - - entry.enum_idx = MENU_ENUM_LABEL_START_NET_RETROPAD; - menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); + entry.enum_idx = MENU_ENUM_LABEL_START_NET_RETROPAD; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); #ifndef HAVE_DYNAMIC - if (frontend_driver_has_fork()) + if (frontend_driver_has_fork()) #endif - { - entry.enum_idx = MENU_ENUM_LABEL_CORE_LIST; + { + entry.enum_idx = MENU_ENUM_LABEL_CORE_LIST; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); + } + + entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); + + entry.enum_idx = MENU_ENUM_LABEL_ADD_CONTENT_LIST; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); +#if defined(HAVE_NETWORKING) + entry.enum_idx = MENU_ENUM_LABEL_ONLINE_UPDATER; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); +#endif } - entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; - menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); - - entry.enum_idx = MENU_ENUM_LABEL_ADD_CONTENT_LIST; - menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); -#if defined(HAVE_NETWORKING) - entry.enum_idx = MENU_ENUM_LABEL_ONLINE_UPDATER; - menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); -#endif entry.enum_idx = MENU_ENUM_LABEL_INFORMATION_LIST; menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); #ifndef HAVE_DYNAMIC entry.enum_idx = MENU_ENUM_LABEL_RESTART_RETROARCH; menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); #endif - entry.enum_idx = MENU_ENUM_LABEL_CONFIGURATIONS; - menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); - entry.enum_idx = MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG; - menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); +#ifdef HAVE_KIOSK + if (!hide_entries) +#endif + { + entry.enum_idx = MENU_ENUM_LABEL_CONFIGURATIONS; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); - entry.enum_idx = MENU_ENUM_LABEL_SAVE_NEW_CONFIG; - menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); + entry.enum_idx = MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); + + entry.enum_idx = MENU_ENUM_LABEL_SAVE_NEW_CONFIG; + menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); + } entry.enum_idx = MENU_ENUM_LABEL_HELP_LIST; menu_displaylist_ctl(DISPLAYLIST_SETTING_ENUM, &entry); diff --git a/menu/menu_display.h b/menu/menu_display.h index df0162965e..8cedc7a134 100644 --- a/menu/menu_display.h +++ b/menu/menu_display.h @@ -65,6 +65,21 @@ enum xmb_icon_theme XMB_ICON_THEME_CUSTOM }; +#ifdef HAVE_XMB +enum xmb_node_position +{ + XMB_NODE_POSITION_HIDDEN = 0, + XMB_NODE_POSITION_NORMAL = 1, + XMB_NODE_POSITION_RIGHT = 9, + XMB_NODE_POSITION_LAST = (XMB_NODE_POSITION_RIGHT - 1) * 2 +}; +#ifdef HAVE_KIOSK +#define XMB_NODE_POSITION_END XMB_NODE_POSITION_LAST +#else +#define XMB_NODE_POSITION_END XMB_NODE_POSITION_NORMAL +#endif +#endif + enum xmb_shader_pipeline { XMB_SHADER_PIPELINE_WALLPAPER = 0, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 13ec905e1f..e0d51c0875 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2647,9 +2647,13 @@ static int menu_displaylist_parse_load_content_settings( menu_displaylist_info_t *info) { menu_handle_t *menu = NULL; -#ifdef HAVE_CHEEVOS +#if defined(HAVE_CHEEVOS) || defined(HAVE_KIOSK) settings_t *settings = config_get_ptr(); #endif +#ifdef HAVE_KIOSK + bool hide_entries = false; +#endif + if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return -1; @@ -2657,6 +2661,13 @@ static int menu_displaylist_parse_load_content_settings( { rarch_system_info_t *system = NULL; +#ifdef HAVE_KIOSK +#ifdef HAVE_XMB + if (!settings->menu.xmb.node_position_main && !settings->menu.show_advanced_settings) + hide_entries = true; +#endif +#endif + runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); menu_entries_append_enum(info->list, @@ -2710,39 +2721,43 @@ static int menu_displaylist_parse_load_content_settings( MENU_ENUM_LABEL_UNDO_SAVE_STATE, MENU_SETTING_ACTION_LOADSTATE, 0, 0); - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS), - msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS), - MENU_ENUM_LABEL_CORE_OPTIONS, - MENU_SETTING_ACTION, 0, 0); - - if (core_has_set_input_descriptor()) +#ifdef HAVE_KIOSK + if (!hide_entries) +#endif + { menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS), - msg_hash_to_str(MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS), - MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS), + msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS), + MENU_ENUM_LABEL_CORE_OPTIONS, MENU_SETTING_ACTION, 0, 0); + if (core_has_set_input_descriptor()) + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS), + msg_hash_to_str(MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS), + MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, + MENU_SETTING_ACTION, 0, 0); - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS), - msg_hash_to_str(MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS), - MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS, - MENU_SETTING_ACTION, 0, 0); - if ( (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) - && system && system->disk_control_cb.get_num_images) menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS), - msg_hash_to_str(MENU_ENUM_LABEL_DISK_OPTIONS), - MENU_ENUM_LABEL_DISK_OPTIONS, - MENU_SETTING_ACTION_CORE_DISK_OPTIONS, 0, 0); + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS), + msg_hash_to_str(MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS), + MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS, + MENU_SETTING_ACTION, 0, 0); + if ( (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) + && system && system->disk_control_cb.get_num_images) + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS), + msg_hash_to_str(MENU_ENUM_LABEL_DISK_OPTIONS), + MENU_ENUM_LABEL_DISK_OPTIONS, + MENU_SETTING_ACTION_CORE_DISK_OPTIONS, 0, 0); #ifdef HAVE_SHADER_MANAGER - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS), - msg_hash_to_str(MENU_ENUM_LABEL_SHADER_OPTIONS), - MENU_ENUM_LABEL_SHADER_OPTIONS, - MENU_SETTING_ACTION, 0, 0); + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS), + msg_hash_to_str(MENU_ENUM_LABEL_SHADER_OPTIONS), + MENU_ENUM_LABEL_SHADER_OPTIONS, + MENU_SETTING_ACTION, 0, 0); #endif + } #ifdef HAVE_CHEEVOS if(settings->cheevos.enable) menu_entries_append_enum(info->list, @@ -4654,6 +4669,39 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME, PARSE_ONLY_UINT, false); +#ifdef HAVE_XMB +#ifdef HAVE_KIOSK + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_XMB_NODE_POSITION_MAIN, + PARSE_ONLY_UINT, false); +#endif +#if !defined(HAVE_XMB_REQUIRESETTINGS) || defined(HAVE_KIOSK) + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_XMB_NODE_POSITION_SETTINGS, + PARSE_ONLY_UINT, false); +#endif +#ifdef HAVE_IMAGEVIEWER + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_XMB_NODE_POSITION_IMAGES, + PARSE_ONLY_UINT, false); +#endif +#ifdef HAVE_FFMPEG + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_XMB_NODE_POSITION_MUSIC, + PARSE_ONLY_UINT, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_XMB_NODE_POSITION_VIDEO, + PARSE_ONLY_UINT, false); +#endif + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_XMB_NODE_POSITION_HISTORY, + PARSE_ONLY_UINT, false); +#ifdef HAVE_LIBRETRODB + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_XMB_NODE_POSITION_ADD, + PARSE_ONLY_UINT, false); +#endif +#endif menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_MATERIALUI_MENU_COLOR_THEME, PARSE_ONLY_UINT, false); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index f4aeb3c81f..f8d8548e6c 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -7020,6 +7020,121 @@ static bool setting_append_list( general_read_handler); menu_settings_list_current_add_range(list, list_info, 0, XMB_THEME_LAST-1, 1, true, true); menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME); + +#ifdef HAVE_KIOSK + CONFIG_UINT( + list, list_info, + &settings->menu.xmb.node_position_main, + msg_hash_to_str(MENU_ENUM_LABEL_XMB_NODE_POSITION_MAIN), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_MAIN), + XMB_NODE_POSITION_NORMAL, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, XMB_NODE_POSITION_HIDDEN, XMB_NODE_POSITION_END, 1, true, true); + settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_XMB_NODE_POSITION_MAIN); +#endif + +#if !defined(HAVE_XMB_REQUIRESETTINGS) || defined(HAVE_KIOSK) + CONFIG_UINT( + list, list_info, + &settings->menu.xmb.node_position_settings, + msg_hash_to_str(MENU_ENUM_LABEL_XMB_NODE_POSITION_SETTINGS), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_SETTINGS), + XMB_NODE_POSITION_NORMAL, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, XMB_NODE_POSITION_HIDDEN, XMB_NODE_POSITION_END, 1, true, true); + settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_XMB_NODE_POSITION_SETTINGS); +#endif + +#ifdef HAVE_IMAGEVIEWER + CONFIG_UINT( + list, list_info, + &settings->menu.xmb.node_position_images, + msg_hash_to_str(MENU_ENUM_LABEL_XMB_NODE_POSITION_IMAGES), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_IMAGES), + XMB_NODE_POSITION_NORMAL, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, XMB_NODE_POSITION_HIDDEN, XMB_NODE_POSITION_END, 1, true, true); + settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_XMB_NODE_POSITION_IMAGES); +#endif + +#ifdef HAVE_FFMPEG + CONFIG_UINT( + list, list_info, + &settings->menu.xmb.node_position_music, + msg_hash_to_str(MENU_ENUM_LABEL_XMB_NODE_POSITION_MUSIC), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_MUSIC), + XMB_NODE_POSITION_NORMAL, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, XMB_NODE_POSITION_HIDDEN, XMB_NODE_POSITION_END, 1, true, true); + settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_XMB_NODE_POSITION_MUSIC); + + CONFIG_UINT( + list, list_info, + &settings->menu.xmb.node_position_video, + msg_hash_to_str(MENU_ENUM_LABEL_XMB_NODE_POSITION_VIDEO), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_VIDEO), + XMB_NODE_POSITION_NORMAL, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, XMB_NODE_POSITION_HIDDEN, XMB_NODE_POSITION_END, 1, true, true); + settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_XMB_NODE_POSITION_VIDEO); +#endif + + CONFIG_UINT( + list, list_info, + &settings->menu.xmb.node_position_history, + msg_hash_to_str(MENU_ENUM_LABEL_XMB_NODE_POSITION_HISTORY), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_HISTORY), + XMB_NODE_POSITION_NORMAL, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, XMB_NODE_POSITION_HIDDEN, XMB_NODE_POSITION_END, 1, true, true); + settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_XMB_NODE_POSITION_HISTORY); + +#ifdef HAVE_LIBRETRODB + CONFIG_UINT( + list, list_info, + &settings->menu.xmb.node_position_add, + msg_hash_to_str(MENU_ENUM_LABEL_XMB_NODE_POSITION_ADD), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_ADD), + XMB_NODE_POSITION_NORMAL, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, XMB_NODE_POSITION_HIDDEN, XMB_NODE_POSITION_END, 1, true, true); + settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_XMB_NODE_POSITION_ADD); +#endif } #endif diff --git a/msg_hash.h b/msg_hash.h index d7ac0fe4e2..142337d738 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -322,6 +322,10 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_VOLCANIC_RED, MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK, MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN, + +#ifdef HAVE_XMB + MENU_ENUM_LABEL_VALUE_XMB_MENU_NODE_POSITION_REORDERED, +#endif MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, @@ -561,6 +565,23 @@ enum msg_hash_enums MENU_ENUM_LABEL_XMB_FONT, MENU_ENUM_LABEL_XMB_THEME, MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME, +#ifdef HAVE_XMB +#ifdef HAVE_KIOSK + MENU_ENUM_LABEL_XMB_NODE_POSITION_MAIN, +#endif + MENU_ENUM_LABEL_XMB_NODE_POSITION_SETTINGS, +#ifdef HAVE_IMAGEVIEWER + MENU_ENUM_LABEL_XMB_NODE_POSITION_IMAGES, +#endif +#ifdef HAVE_FFMPEG + MENU_ENUM_LABEL_XMB_NODE_POSITION_MUSIC, + MENU_ENUM_LABEL_XMB_NODE_POSITION_VIDEO, +#endif + MENU_ENUM_LABEL_XMB_NODE_POSITION_HISTORY, +#ifdef HAVE_LIBRETRODB + MENU_ENUM_LABEL_XMB_NODE_POSITION_ADD, +#endif +#endif MENU_ENUM_LABEL_XMB_SHADOWS_ENABLE, MENU_ENUM_LABEL_XMB_RIBBON_ENABLE, MENU_ENUM_LABEL_THUMBNAILS, @@ -583,6 +604,23 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_XMB_FONT, MENU_ENUM_LABEL_VALUE_XMB_THEME, MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, +#ifdef HAVE_XMB +#ifdef HAVE_KIOSK + MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_MAIN, +#endif + MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_SETTINGS, +#ifdef HAVE_IMAGEVIEWER + MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_IMAGES, +#endif +#ifdef HAVE_FFMPEG + MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_MUSIC, + MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_VIDEO, +#endif + MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_HISTORY, +#ifdef HAVE_LIBRETRODB + MENU_ENUM_LABEL_VALUE_XMB_NODE_POSITION_ADD, +#endif +#endif MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE, MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE, MENU_ENUM_LABEL_VALUE_THUMBNAILS,