diff --git a/configuration.c b/configuration.c index bbded9222b..5480f550de 100644 --- a/configuration.c +++ b/configuration.c @@ -787,6 +787,7 @@ static int populate_settings_bool(settings_t *settings, struct config_bool_setti SETTING_BOOL("menu_mouse_enable", &settings->menu.mouse.enable, true, def_mouse_enable, false); SETTING_BOOL("menu_pointer_enable", &settings->menu.pointer.enable, true, pointer_enable, false); SETTING_BOOL("menu_timedate_enable", &settings->menu.timedate_enable, true, true, false); + SETTING_BOOL("menu_battery_level_enable", &settings->menu.battery_level_enable, true, true, false); SETTING_BOOL("menu_core_enable", &settings->menu.core_enable, true, true, false); SETTING_BOOL("menu_dynamic_wallpaper_enable", &settings->menu.dynamic_wallpaper_enable, true, false, false); #ifdef HAVE_XMB diff --git a/configuration.h b/configuration.h index 8b77811b82..c0f7bf7626 100644 --- a/configuration.h +++ b/configuration.h @@ -125,6 +125,7 @@ typedef struct settings char driver[32]; bool pause_libretro; bool timedate_enable; + bool battery_level_enable; bool core_enable; bool dynamic_wallpaper_enable; unsigned thumbnails; diff --git a/deps/SPIRV-Cross b/deps/SPIRV-Cross index 875c32fd39..cc207e32c8 160000 --- a/deps/SPIRV-Cross +++ b/deps/SPIRV-Cross @@ -1 +1 @@ -Subproject commit 875c32fd39a06f624814effe5eab691b078429f5 +Subproject commit cc207e32c8668bfe5a5cc514394e7df8f020ecf6 diff --git a/deps/glslang/glslang b/deps/glslang/glslang index be8462149a..ec2e27adf8 160000 --- a/deps/glslang/glslang +++ b/deps/glslang/glslang @@ -1 +1 @@ -Subproject commit be8462149a3c150fc89db84e57ef06de3ab90d47 +Subproject commit ec2e27adf86a911c5af6c676a539166b5674a09d diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 14fc3b3dfc..f6b734057c 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -2278,3 +2278,5 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE, "OSDメッセージを表する。") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE, "ユーザー%dのリモートを有効") +MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, + "電池残量を表示") diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index da4e6a5521..2190eecb64 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1163,3 +1163,5 @@ MSG_HASH(MENU_ENUM_LABEL_INPUT_UNIFIED_MENU_CONTROLS, "unified_menu_controls") MSG_HASH(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR, "detect_core_list_push_dir") +MSG_HASH(MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE, + "menu_battery_level_enable") diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index aee30281a6..e26c88cd67 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -1614,6 +1614,10 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Shows current date and/or time inside menu."); break; + case MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE: + snprintf(s, len, + "Shows current battery level inside menu."); + break; case MENU_ENUM_LABEL_CORE_ENABLE: snprintf(s, len, "Shows current core inside menu."); diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 8bebf08327..d6f64669d2 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2349,3 +2349,5 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE, "Show onscreen messages.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE, "User %d Remote Enable") +MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, + "Display battery level") diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 3ff0ad0d3b..1769b0b6e9 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -29,6 +29,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include "../../config.h" @@ -68,6 +69,8 @@ #define XMB_DELAY 10 #endif +#define BATTERY_LEVEL_CHECK_INTERVAL (30 * 1000000) + #if 0 #define XMB_DEBUG #endif @@ -126,6 +129,8 @@ enum XMB_TEXTURE_SWITCH_ON, XMB_TEXTURE_SWITCH_OFF, XMB_TEXTURE_CLOCK, + XMB_TEXTURE_BATTERY_FULL, + XMB_TEXTURE_BATTERY_CHARGING, XMB_TEXTURE_POINTER, XMB_TEXTURE_ADD, XMB_TEXTURE_KEY, @@ -2515,6 +2520,7 @@ static void xmb_draw_dark_layer( static void xmb_frame(void *data) { size_t selection; + size_t datetime_width = 0; math_matrix_4x4 mymat; unsigned i, width, height; float item_color[16], coord_black[16], coord_white[16]; @@ -2591,7 +2597,6 @@ static void xmb_frame(void *data) menu_display_rotate_z(&rotate_draw); menu_display_blend_begin(); - /* Clock image */ menu_display_set_alpha(coord_white, MIN(xmb->alpha, 1.00f)); @@ -2622,12 +2627,76 @@ static void xmb_frame(void *data) menu_display_timedate(&datetime); + datetime_width = font_driver_get_message_width(xmb->font, timedate, utf8len(timedate), 1); + xmb_draw_text(xmb, timedate, width - xmb->margins.title.left - xmb->icon.size / 4, xmb->margins.title.top, 1, 1, TEXT_ALIGN_RIGHT, width, height, xmb->font); } + if (settings->menu.battery_level_enable) + { + static retro_time_t last_time = 0; + static int percent = 0; + static enum frontend_powerstate state = FRONTEND_POWERSTATE_NONE; + int seconds = 0; + bool time_to_update = false; + const frontend_ctx_driver_t *frontend = frontend_get_ptr(); + retro_time_t current_time = cpu_features_get_time_usec(); + + if (current_time - last_time >= BATTERY_LEVEL_CHECK_INTERVAL) + time_to_update = true; + + if (frontend && frontend->get_powerstate) + { + char msg[12]; + bool charging = (state == FRONTEND_POWERSTATE_CHARGING); + + if (time_to_update) + state = frontend->get_powerstate(&seconds, &percent); + + *msg = '\0'; + + last_time = current_time; + + if (percent > 0) + { + size_t x_pos = 0; + size_t x_pos_icon = xmb->margins.title.left / 2; + + if (datetime_width) + x_pos_icon += datetime_width + (xmb->icon.size / 2) + (xmb->margins.title.left / 2); + + if (coord_white[3] != 0) + xmb_draw_icon( + xmb->icon.size, + &mymat, + xmb->textures.list[charging ? XMB_TEXTURE_BATTERY_CHARGING : XMB_TEXTURE_BATTERY_FULL], + width - (xmb->icon.size / 2) - x_pos_icon, + xmb->icon.size, + width, + height, + 1, + 0, + 1, + &coord_white[0], + xmb->shadow_offset); + + snprintf(msg, sizeof(msg), "%d%%", percent); + + if (datetime_width) + x_pos = datetime_width + (xmb->icon.size / 5) + + xmb->margins.title.left; + + xmb_draw_text(xmb, msg, + width - xmb->margins.title.left - x_pos, + xmb->margins.title.top, 1, 1, TEXT_ALIGN_RIGHT, + width, height, xmb->font); + } + } + } + /* Arrow image */ menu_display_set_alpha(coord_white, MIN(xmb->textures.arrow.alpha, xmb->alpha)); @@ -3258,6 +3327,10 @@ static const char *xmb_texture_path(unsigned id) return "resume.png"; case XMB_TEXTURE_CLOCK: return "clock.png"; + case XMB_TEXTURE_BATTERY_FULL: + return "battery-full.png"; + case XMB_TEXTURE_BATTERY_CHARGING: + return "battery-charging.png"; case XMB_TEXTURE_POINTER: return "pointer.png"; case XMB_TEXTURE_SAVESTATE: diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index de495a20f5..65b48e79fe 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -4554,6 +4554,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_TIMEDATE_ENABLE, PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE, + PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CORE_ENABLE, PARSE_ONLY_BOOL, false); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 18d31fc96e..abe01b1bf4 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -5181,6 +5181,21 @@ static bool setting_append_list( general_read_handler, SD_FLAG_ADVANCED); + CONFIG_BOOL( + list, list_info, + &settings->menu.battery_level_enable, + MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE, + MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, + true, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_ADVANCED); + CONFIG_BOOL( list, list_info, &settings->menu.core_enable, diff --git a/msg_hash.h b/msg_hash.h index 5f080ca84d..6216b738fa 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -665,6 +665,7 @@ enum msg_hash_enums MENU_LABEL(XMB_RIBBON_ENABLE), MENU_LABEL(THUMBNAILS), MENU_LABEL(TIMEDATE_ENABLE), + MENU_LABEL(BATTERY_LEVEL_ENABLE), MENU_LABEL(MATERIALUI_MENU_COLOR_THEME), /* UI settings */ diff --git a/retroarch.cfg b/retroarch.cfg index 4f660bd41f..98539ddec1 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -652,6 +652,9 @@ # Shows current date and/or time inside menu. # menu_timedate_enable = true +# Shows current battery level inside menu. +# menu_battery_level_enable = true + # Shows current core inside menu. # menu_core_enable = true