diff --git a/config.def.h b/config.def.h index c75cd1f59f..406305b7d4 100644 --- a/config.def.h +++ b/config.def.h @@ -511,6 +511,7 @@ static bool default_block_config_read = true; static unsigned xmb_scale_factor = 100; static unsigned xmb_alpha_factor = 75; +static unsigned xmb_theme = 0; static bool show_advanced_settings = true; static const uint32_t menu_entry_normal_color = 0xffffffff; diff --git a/configuration.c b/configuration.c index 5c32045856..66982a89e4 100644 --- a/configuration.c +++ b/configuration.c @@ -480,6 +480,7 @@ static void config_set_defaults(void) def_menu, sizeof(settings->menu.driver)); settings->menu.xmb_scale_factor = xmb_scale_factor; settings->menu.xmb_alpha_factor = xmb_alpha_factor; + settings->menu.xmb_theme = xmb_theme; settings->menu.xmb_font[0] = '\0'; settings->menu.throttle_framerate = true; settings->menu.linear_filter = true; @@ -1530,6 +1531,7 @@ static bool config_load_file(const char *path, bool set_defaults) config_get_array(conf, "menu_driver", settings->menu.driver, sizeof(settings->menu.driver)); CONFIG_GET_INT_BASE(conf, settings, menu.xmb_scale_factor, "xmb_scale_factor"); CONFIG_GET_INT_BASE(conf, settings, menu.xmb_alpha_factor, "xmb_alpha_factor"); + CONFIG_GET_INT_BASE(conf, settings, menu.xmb_theme, "xmb_theme"); config_get_path(conf, "xmb_font", settings->menu.xmb_font, sizeof(settings->menu.xmb_font)); #endif config_get_array(conf, "video_context_driver", settings->video.context_driver, sizeof(settings->video.context_driver)); @@ -2754,6 +2756,7 @@ bool config_save_file(const char *path) #ifdef HAVE_MENU config_set_int(conf, "xmb_scale_factor", settings->menu.xmb_scale_factor); config_set_int(conf, "xmb_alpha_factor", settings->menu.xmb_alpha_factor); + config_set_int(conf, "xmb_theme", settings->menu.xmb_theme); config_set_path(conf, "xmb_font", !string_is_empty(settings->menu.xmb_font) ? settings->menu.xmb_font : ""); config_set_path(conf, "rgui_browser_directory", diff --git a/configuration.h b/configuration.h index afec18fd94..6f2346f8bc 100644 --- a/configuration.h +++ b/configuration.h @@ -166,6 +166,7 @@ typedef struct settings unsigned title_color; unsigned xmb_scale_factor; unsigned xmb_alpha_factor; + unsigned xmb_theme; char xmb_font[PATH_MAX_LENGTH]; bool throttle_framerate; bool linear_filter; diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 5af935ccce..9b7b12e672 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -585,6 +585,36 @@ static void menu_action_setting_disp_set_label_poll_type_behavior( } } +static void menu_action_setting_disp_set_label_xmb_theme( + 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; + + strlcpy(s2, path, len2); + *w = 19; + switch (settings->menu.xmb_theme) + { + case 0: + snprintf(s, len, "%s", "Monochrome"); + break; + case 1: + snprintf(s, len, "%s", "FlatUI"); + break; + case 2: + snprintf(s, len, "%s", "Custom"); + break; + } +} + static void menu_action_setting_disp_set_label_menu_toggle_gamepad_combo( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -1139,6 +1169,10 @@ static int menu_cbs_init_bind_get_string_representation_compare_label( BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_poll_type_behavior); break; + case MENU_LABEL_XMB_THEME: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_xmb_theme); + break; case MENU_LABEL_INPUT_MENU_TOGGLE_GAMEPAD_COMBO: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_menu_toggle_gamepad_combo); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 30ed6dd2d6..8cf61bc551 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -48,10 +48,6 @@ #include "../../tasks/tasks_internal.h" -#ifndef XMB_THEME -#define XMB_THEME "monochrome" -#endif - #ifndef XMB_DELAY #define XMB_DELAY 10 #endif @@ -231,6 +227,22 @@ typedef struct xmb_handle gfx_font_raster_block_t raster_block; } xmb_handle_t; +static char* xmb_theme() +{ + settings_t *settings = config_get_ptr(); + switch (settings->menu.xmb_theme) + { + case 0: + return "monochrome"; + case 1: + return "flatui"; + case 2: + return "custom"; + default: + return "monochrome"; + } +} + static void xmb_fill_default_background_path(xmb_handle_t *xmb, char *path, size_t size) { @@ -243,7 +255,7 @@ static void xmb_fill_default_background_path(xmb_handle_t *xmb, fill_pathname_join(mediapath, settings->assets_directory, "xmb", sizeof(mediapath)); - fill_pathname_join(themepath, mediapath, XMB_THEME, sizeof(themepath)); + fill_pathname_join(themepath, mediapath, xmb_theme(), sizeof(themepath)); fill_pathname_join(iconpath, themepath, xmb->icon.dir, sizeof(iconpath)); fill_pathname_slash(iconpath, sizeof(iconpath)); @@ -1265,7 +1277,7 @@ static void xmb_refresh_horizontal_list(xmb_handle_t *xmb) fill_pathname_join(mediapath, settings->assets_directory, "xmb", sizeof(mediapath)); - fill_pathname_join(themepath, mediapath, XMB_THEME, sizeof(themepath)); + fill_pathname_join(themepath, mediapath, xmb_theme(), sizeof(themepath)); xmb_context_destroy_horizontal_list(xmb); if (xmb->horizontal_list) @@ -2062,7 +2074,7 @@ static void xmb_font(xmb_handle_t *xmb) fill_pathname_join(mediapath, settings->assets_directory, "xmb", sizeof(mediapath)); fill_pathname_join(themepath, - mediapath, XMB_THEME, sizeof(themepath)); + mediapath, xmb_theme(), sizeof(themepath)); if (string_is_empty(settings->menu.xmb_font)) fill_pathname_join(fontpath, themepath, "font.ttf", sizeof(fontpath)); else @@ -2484,7 +2496,7 @@ static void xmb_context_reset(void *data) fill_pathname_join(mediapath, settings->assets_directory, "xmb", sizeof(mediapath)); - fill_pathname_join(themepath, mediapath, XMB_THEME, sizeof(themepath)); + fill_pathname_join(themepath, mediapath, xmb_theme(), sizeof(themepath)); fill_pathname_join(iconpath, themepath, xmb->icon.dir, sizeof(iconpath)); fill_pathname_slash(iconpath, sizeof(iconpath)); diff --git a/menu/intl/menu_hash_us.c b/menu/intl/menu_hash_us.c index b56d2bcc57..f58f755653 100644 --- a/menu/intl/menu_hash_us.c +++ b/menu/intl/menu_hash_us.c @@ -292,6 +292,8 @@ static const char *menu_hash_to_str_us_label(uint32_t hash) return "dpi_override_value"; case MENU_LABEL_XMB_FONT: return "xmb_font"; + case MENU_LABEL_XMB_THEME: + return "xmb_theme"; case MENU_LABEL_XMB_SCALE_FACTOR: return "xmb_scale_factor"; case MENU_LABEL_XMB_ALPHA_FACTOR: @@ -1040,6 +1042,8 @@ const char *menu_hash_to_str_us(uint32_t hash) return "XMB Alpha Factor"; case MENU_LABEL_VALUE_XMB_FONT: return "XMB Font"; + case MENU_LABEL_VALUE_XMB_THEME: + return "XMB Theme"; case MENU_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE: return "Suspend Screensaver"; case MENU_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION: diff --git a/menu/intl/menu_hash_uspseudo.c b/menu/intl/menu_hash_uspseudo.c index b56c4d3f0f..d6001c7d22 100644 --- a/menu/intl/menu_hash_uspseudo.c +++ b/menu/intl/menu_hash_uspseudo.c @@ -287,6 +287,9 @@ static const char *menu_hash_to_str_us_label(uint32_t hash) return "dpi_override_value"; case MENU_LABEL_XMB_FONT: return "xmb_font"; + case MENU_LABEL_XMB_THEME: + return "xmb_theme"; + case MENU_LABEL_XMB_SCALE_FACTOR: case MENU_LABEL_XMB_SCALE_FACTOR: return "xmb_scale_factor"; case MENU_LABEL_XMB_ALPHA_FACTOR: @@ -1027,6 +1030,8 @@ const char *menu_hash_to_str_us(uint32_t hash) return "XMB Alphá Factor"; case MENU_LABEL_VALUE_XMB_FONT: return "XMB Foñt"; + case MENU_LABEL_VALUE_XMB_THEME: + return "XMB Thèmê"; case MENU_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE: return "Suspeñd Scrêénsàver"; case MENU_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION: diff --git a/menu/menu_hash.h b/menu/menu_hash.h index dbe5b2d016..6e16abc243 100644 --- a/menu/menu_hash.h +++ b/menu/menu_hash.h @@ -386,6 +386,8 @@ extern "C" { #define MENU_LABEL_VALUE_XMB_ALPHA_FACTOR 0x0D5A712F1 #define MENU_LABEL_XMB_FONT 0x0ECA56CA2 #define MENU_LABEL_VALUE_XMB_FONT 0x0020337E7 +#define MENU_LABEL_XMB_THEME 0x824c5a7eU +#define MENU_LABEL_VALUE_XMB_THEME 0x3603f65fU #define MENU_LABEL_VOLUME_UP 0xa66e9681U #define MENU_LABEL_VOLUME_DOWN 0xfc64f3d4U #define MENU_LABEL_LOG_VERBOSITY 0x6648c96dU diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 9ad47063d0..de569afa18 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -5876,6 +5876,19 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_EMPTY); + + CONFIG_UINT( + list, list_info, + &settings->menu.xmb_theme, + menu_hash_to_str(MENU_LABEL_XMB_THEME), + menu_hash_to_str(MENU_LABEL_VALUE_XMB_THEME), + xmb_theme, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, 0, 2, 1, true, true); } CONFIG_BOOL(