From 91fadeb6c339d5aaf6b13276671b3d61dde510a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?George=20Bi=C8=99oc?= Date: Sat, 29 Mar 2025 18:25:45 +0100 Subject: [PATCH] [STOBJECT] Explicitly tell the user the battery is fully charged Short answer: our UI sucks bolas rojas. Long answer: when the NT kernel informs the user-mode part of the system that the battery is no longer charging, the machine is directly powered up by the AC adapter. This is understood by determining the presence of AC_LINE_ONLINE status bit in ACLineStatus member field, which is a Windows API construct. In the NT world this is understood by checking the power state returned by the BATTERY_STATUS structure. What's happening right now is that when the battery is fully charged, ROS UI simply displays "100% remaining" implying the battery is about to discharge, which is not the case. This is extremely confusing to the user. AND WORST PART IS THAT IT'S XP/2003 DESIGN, AND I HATE IT UGGGHHH. With this patch we're leaning towards Windows 10/11 way of informing the user the battery is fully charged. VIVA LA NT6! CORE-18969 CORE-19452 --- dll/shellext/stobject/lang/cs-CZ.rc | 1 + dll/shellext/stobject/lang/de-DE.rc | 1 + dll/shellext/stobject/lang/en-US.rc | 1 + dll/shellext/stobject/lang/es-ES.rc | 1 + dll/shellext/stobject/lang/fr-FR.rc | 1 + dll/shellext/stobject/lang/hi-IN.rc | 1 + dll/shellext/stobject/lang/it-IT.rc | 1 + dll/shellext/stobject/lang/ja-JP.rc | 1 + dll/shellext/stobject/lang/pl-PL.rc | 1 + dll/shellext/stobject/lang/pt-PT.rc | 1 + dll/shellext/stobject/lang/ro-RO.rc | 1 + dll/shellext/stobject/lang/ru-RU.rc | 1 + dll/shellext/stobject/lang/tr-TR.rc | 1 + dll/shellext/stobject/lang/zh-CN.rc | 1 + dll/shellext/stobject/lang/zh-HK.rc | 1 + dll/shellext/stobject/lang/zh-TW.rc | 1 + dll/shellext/stobject/power.cpp | 7 +++++++ dll/shellext/stobject/resource.h | 1 + 18 files changed, 24 insertions(+) diff --git a/dll/shellext/stobject/lang/cs-CZ.rc b/dll/shellext/stobject/lang/cs-CZ.rc index cc700599008..69cdeca8c57 100644 --- a/dll/shellext/stobject/lang/cs-CZ.rc +++ b/dll/shellext/stobject/lang/cs-CZ.rc @@ -24,6 +24,7 @@ BEGIN IDS_PWR_AC "On AC power" IDS_PWR_HOURS_REMAINING "zbývá %1!u!:%2!02u! hodin (%3!u!%%)" IDS_PWR_MINUTES_REMAINING "zbývá %1!u! minut (%2!u!%%)" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "Bezpečně odebrat hardware" diff --git a/dll/shellext/stobject/lang/de-DE.rc b/dll/shellext/stobject/lang/de-DE.rc index 0c4cf561ea2..1ca26f38d0f 100644 --- a/dll/shellext/stobject/lang/de-DE.rc +++ b/dll/shellext/stobject/lang/de-DE.rc @@ -24,6 +24,7 @@ BEGIN IDS_PWR_AC "Mit Wechselstrom" IDS_PWR_HOURS_REMAINING "%1!u!:%2!02u! Stunden (%3!u!%%) verbleibend" IDS_PWR_MINUTES_REMAINING "%1!u! Min. (%2!u!%%) verbleibend" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "Hardware sicher entfernen" diff --git a/dll/shellext/stobject/lang/en-US.rc b/dll/shellext/stobject/lang/en-US.rc index 8fc4e540827..178a82b63d5 100644 --- a/dll/shellext/stobject/lang/en-US.rc +++ b/dll/shellext/stobject/lang/en-US.rc @@ -24,6 +24,7 @@ BEGIN IDS_PWR_AC "On AC power" IDS_PWR_HOURS_REMAINING "%1!u!:%2!02u! hours (%3!u!%%) remaining" IDS_PWR_MINUTES_REMAINING "%1!u! min (%2!u!%%) remaining" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "Safely Remove Hardware" diff --git a/dll/shellext/stobject/lang/es-ES.rc b/dll/shellext/stobject/lang/es-ES.rc index 1c50681e70a..279c739c10b 100644 --- a/dll/shellext/stobject/lang/es-ES.rc +++ b/dll/shellext/stobject/lang/es-ES.rc @@ -25,6 +25,7 @@ BEGIN IDS_PWR_AC "En corriente alterna" IDS_PWR_HOURS_REMAINING "Quedan %1!u!:%2!02u! horas (%3!u!%%)" IDS_PWR_MINUTES_REMAINING "Quedan %1!u! minutos (%2!u!%%)" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "Desconectar de forma segura" diff --git a/dll/shellext/stobject/lang/fr-FR.rc b/dll/shellext/stobject/lang/fr-FR.rc index 878655f3a02..1a43d5833e1 100644 --- a/dll/shellext/stobject/lang/fr-FR.rc +++ b/dll/shellext/stobject/lang/fr-FR.rc @@ -24,6 +24,7 @@ BEGIN IDS_PWR_AC "Sur secteur" IDS_PWR_HOURS_REMAINING "%1!u!:%2!02u! heures (%3!u!%%) restantes" IDS_PWR_MINUTES_REMAINING "%1!u! mins (%2!u!%%) restantes" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "Retirer le périphérique en sécurité" diff --git a/dll/shellext/stobject/lang/hi-IN.rc b/dll/shellext/stobject/lang/hi-IN.rc index f205dc413ed..db15fe20467 100644 --- a/dll/shellext/stobject/lang/hi-IN.rc +++ b/dll/shellext/stobject/lang/hi-IN.rc @@ -31,6 +31,7 @@ BEGIN IDS_PWR_AC "On AC power" IDS_PWR_HOURS_REMAINING "%1!u!:%2!02u! घंटे (%3!u!%%) शेष" IDS_PWR_MINUTES_REMAINING "%1!u! मिनट (%2!u!%%) शेष" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "हार्डवेयर सुरक्षित रूप से निकालें" diff --git a/dll/shellext/stobject/lang/it-IT.rc b/dll/shellext/stobject/lang/it-IT.rc index 7ab7548cd5e..a61a5ba9397 100644 --- a/dll/shellext/stobject/lang/it-IT.rc +++ b/dll/shellext/stobject/lang/it-IT.rc @@ -24,6 +24,7 @@ BEGIN IDS_PWR_AC "Alimentazione da rete AC" IDS_PWR_HOURS_REMAINING "%1!u!:%2!02u! ore (%3!u!%%) rimanenti" IDS_PWR_MINUTES_REMAINING "%1!u! minuti (%2!u!%%) rimanenti" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "Rimozione sicura dell'Hardware" diff --git a/dll/shellext/stobject/lang/ja-JP.rc b/dll/shellext/stobject/lang/ja-JP.rc index c775f35b425..c382671f7e4 100644 --- a/dll/shellext/stobject/lang/ja-JP.rc +++ b/dll/shellext/stobject/lang/ja-JP.rc @@ -24,6 +24,7 @@ BEGIN IDS_PWR_AC "交流電源" IDS_PWR_HOURS_REMAINING "残り %1!u!:%2!02u! 時間 (%3!u!%%)" IDS_PWR_MINUTES_REMAINING "残り %1!u! 分 (%2!u!%%)" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "安全なハードウェアの取り外し" diff --git a/dll/shellext/stobject/lang/pl-PL.rc b/dll/shellext/stobject/lang/pl-PL.rc index f5e136cdd2f..0d534801fff 100644 --- a/dll/shellext/stobject/lang/pl-PL.rc +++ b/dll/shellext/stobject/lang/pl-PL.rc @@ -24,6 +24,7 @@ BEGIN IDS_PWR_AC "Podłączony do zasilania" IDS_PWR_HOURS_REMAINING "Pozostało %1!u!:%2!02u! godzin (%3!u!%%)" IDS_PWR_MINUTES_REMAINING "Pozostało %1!u! minut (%2!u!%%)" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "Bezpieczne usuwanie sprzętu" diff --git a/dll/shellext/stobject/lang/pt-PT.rc b/dll/shellext/stobject/lang/pt-PT.rc index ed1b9f1277a..82010cca9ca 100644 --- a/dll/shellext/stobject/lang/pt-PT.rc +++ b/dll/shellext/stobject/lang/pt-PT.rc @@ -24,6 +24,7 @@ BEGIN IDS_PWR_AC "Energia AC" IDS_PWR_HOURS_REMAINING "%1!u!:%2!02u! horas (%3!u!%%) remanescente" IDS_PWR_MINUTES_REMAINING "%1!u! min (%2!u!%%) remanescente" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "&Remover Hardware em segurança" diff --git a/dll/shellext/stobject/lang/ro-RO.rc b/dll/shellext/stobject/lang/ro-RO.rc index a98f894e493..47fd079cc14 100644 --- a/dll/shellext/stobject/lang/ro-RO.rc +++ b/dll/shellext/stobject/lang/ro-RO.rc @@ -32,6 +32,7 @@ BEGIN IDS_PWR_AC "Când există sursă CA" IDS_PWR_HOURS_REMAINING "%1!u!:%2!02u! ore (%3!u!%%) rămase" IDS_PWR_MINUTES_REMAINING "%1!u! minute (%2!u!%%) rămase" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "Eliminarea în siguranţă a unui dispozitiv hardware" diff --git a/dll/shellext/stobject/lang/ru-RU.rc b/dll/shellext/stobject/lang/ru-RU.rc index a3bd305690f..cd18fd1fccd 100644 --- a/dll/shellext/stobject/lang/ru-RU.rc +++ b/dll/shellext/stobject/lang/ru-RU.rc @@ -32,6 +32,7 @@ BEGIN IDS_PWR_AC "От сети переменного тока" IDS_PWR_HOURS_REMAINING "%1!u!:%2!02u! часов (%3!u!%%) осталось" IDS_PWR_MINUTES_REMAINING "%1!u! минут (%2!u!%%) осталось" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "Безопасное извлечение устройства" diff --git a/dll/shellext/stobject/lang/tr-TR.rc b/dll/shellext/stobject/lang/tr-TR.rc index 1eb0e1a0167..8912a2645c4 100644 --- a/dll/shellext/stobject/lang/tr-TR.rc +++ b/dll/shellext/stobject/lang/tr-TR.rc @@ -26,6 +26,7 @@ BEGIN IDS_PWR_AC "Dalgalı akımda (AC)." IDS_PWR_HOURS_REMAINING "%1!u!.%2!02u! saat (%%%3!u!) kalan" IDS_PWR_MINUTES_REMAINING "%1!u! dakika (%%%2!u!) kalan" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "Donanımı Güvenli Kaldır" diff --git a/dll/shellext/stobject/lang/zh-CN.rc b/dll/shellext/stobject/lang/zh-CN.rc index 158ad795c3e..e57736e01fb 100644 --- a/dll/shellext/stobject/lang/zh-CN.rc +++ b/dll/shellext/stobject/lang/zh-CN.rc @@ -26,6 +26,7 @@ BEGIN IDS_PWR_AC "交流电源" IDS_PWR_HOURS_REMAINING "剩余 %1!u!:%2!02u!(%3!u!%%)" IDS_PWR_MINUTES_REMAINING "剩余 %1!u! 分钟(%2!u!%%)" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "安全地删除硬件" diff --git a/dll/shellext/stobject/lang/zh-HK.rc b/dll/shellext/stobject/lang/zh-HK.rc index e8b6d0e75f7..a9100033bf7 100644 --- a/dll/shellext/stobject/lang/zh-HK.rc +++ b/dll/shellext/stobject/lang/zh-HK.rc @@ -32,6 +32,7 @@ BEGIN IDS_PWR_AC "交流電源" IDS_PWR_HOURS_REMAINING "剩餘 %1!u!:%2!02u! 小時(%3!u!%%) " IDS_PWR_MINUTES_REMAINING "剩餘 %1!u! 分鐘(%2!u!%%) " + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "安全地移除硬件" diff --git a/dll/shellext/stobject/lang/zh-TW.rc b/dll/shellext/stobject/lang/zh-TW.rc index 9b892f9dc8e..303469b8200 100644 --- a/dll/shellext/stobject/lang/zh-TW.rc +++ b/dll/shellext/stobject/lang/zh-TW.rc @@ -32,6 +32,7 @@ BEGIN IDS_PWR_AC "交流電源" IDS_PWR_HOURS_REMAINING "剩餘 %1!u!:%2!02u! 小時(%3!u!%%)" IDS_PWR_MINUTES_REMAINING "剩餘 %1!u! 分鐘(%2!u!%%)" + IDS_PWR_FULLY_CHARGED "Fully charged" //Hotplug related strings IDS_HOTPLUG_REMOVE_1 "安全地移除硬體" diff --git a/dll/shellext/stobject/power.cpp b/dll/shellext/stobject/power.cpp index 7f714cf6253..4ccae037bdd 100644 --- a/dll/shellext/stobject/power.cpp +++ b/dll/shellext/stobject/power.cpp @@ -105,6 +105,13 @@ static HICON DynamicLoadIcon(HINSTANCE hinst) hBatIcon = LoadIcon(hinst, MAKEINTRESOURCE(bc_icons[index])); g_strTooltip.Format(IDS_PWR_CHARGING, PowerStatus.BatteryLifePercent); } + else if (PowerStatus.ACLineStatus == AC_LINE_ONLINE && + PowerStatus.BatteryLifePercent == 100) + { + index = Quantize(PowerStatus.BatteryLifePercent); + hBatIcon = LoadIcon(hinst, MAKEINTRESOURCE(bc_icons[index])); + g_strTooltip.LoadStringW(IDS_PWR_FULLY_CHARGED); + } else if (((PowerStatus.BatteryFlag & BATTERY_FLAG_NO_BATTERY) == 0) && ((PowerStatus.BatteryFlag & BATTERY_FLAG_CHARGING) == 0)) { diff --git a/dll/shellext/stobject/resource.h b/dll/shellext/stobject/resource.h index 66e6aed204f..e7b60954015 100644 --- a/dll/shellext/stobject/resource.h +++ b/dll/shellext/stobject/resource.h @@ -11,6 +11,7 @@ #define IDS_PWR_AC 161 #define IDS_PWR_HOURS_REMAINING 162 #define IDS_PWR_MINUTES_REMAINING 163 +#define IDS_PWR_FULLY_CHARGED 164 #define IDI_BATTERY 200 #define IDI_EXTRACT 210