[PATCH 4/4] kernel32: Implement GetSystemPowerStatus on Linux

Alex Henrie alexhenrie24 at gmail.com
Sun Sep 22 16:12:12 CDT 2019


Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
 dlls/kernel32/powermgnt.c | 72 +++++++++++++++++++++++++++++++++------
 1 file changed, 62 insertions(+), 10 deletions(-)

diff --git a/dlls/kernel32/powermgnt.c b/dlls/kernel32/powermgnt.c
index 7efd84d410..1382f19c50 100644
--- a/dlls/kernel32/powermgnt.c
+++ b/dlls/kernel32/powermgnt.c
@@ -18,6 +18,8 @@
  */
 
 #include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
 
 #define NONAMELESSUNION
 #define NONAMELESSSTRUCT
@@ -45,19 +47,69 @@ BOOL WINAPI GetDevicePowerState(HANDLE hDevice, BOOL* pfOn)
  */
 BOOL WINAPI GetSystemPowerStatus(LPSYSTEM_POWER_STATUS ps)
 {
-    WARN("(%p): stub, harmless.\n", ps);
+#ifdef linux
+    FILE *f;
+    char s[16];
+    BOOL unknown;
+#endif
+
+    TRACE("(%p)\n", ps);
+
+    ps->ACLineStatus        = AC_LINE_UNKNOWN;
+    ps->BatteryFlag         = BATTERY_FLAG_UNKNOWN;
+    ps->BatteryLifePercent  = BATTERY_PERCENTAGE_UNKNOWN;
+    ps->SystemStatusFlag    = 0;
+    ps->BatteryLifeTime     = BATTERY_LIFE_UNKNOWN;
+    ps->BatteryFullLifeTime = BATTERY_LIFE_UNKNOWN;
+
+#ifdef linux
+    if ((f = fopen("/sys/class/power_supply/AC/online", "r")))
+    {
+        if (fgets(s, sizeof(s), f))
+            ps->ACLineStatus = atoi(s);
+        fclose(f);
+    }
 
-    if (ps)
+    if (access("/sys/class/power_supply/BAT0", F_OK) == -1)
     {
-        ps->ACLineStatus        = 255;
-        ps->BatteryFlag         = 255;
-        ps->BatteryLifePercent  = 255;
-        ps->SystemStatusFlag    = 0;
-        ps->BatteryLifeTime     = ~0u;
-        ps->BatteryFullLifeTime = ~0u;
-        return TRUE;
+        ps->BatteryFlag = BATTERY_FLAG_NO_BATTERY;
     }
-    return FALSE;
+    else
+    {
+        ps->BatteryFlag = 0;
+        unknown = TRUE;
+        if ((f = fopen("/sys/class/power_supply/BAT0/capacity", "r")))
+        {
+            if (fgets(s, sizeof(s), f))
+            {
+                ps->BatteryLifePercent = atoi(s);
+                if (ps->BatteryLifePercent > 66)
+                    ps->BatteryFlag |= BATTERY_FLAG_HIGH;
+                if (ps->BatteryLifePercent < 33)
+                    ps->BatteryFlag |= BATTERY_FLAG_LOW;
+                if (ps->BatteryLifePercent < 5)
+                    ps->BatteryFlag |= BATTERY_FLAG_CRITICAL;
+                unknown = FALSE;
+            }
+            fclose(f);
+        }
+        if ((f = fopen("/sys/class/power_supply/BAT0/status", "r")))
+        {
+            if (fgets(s, sizeof(s), f))
+            {
+                if (strcmp(s, "Charging") == 0)
+                    ps->BatteryFlag |= BATTERY_FLAG_CHARGING;
+                unknown = FALSE;
+            }
+            fclose(f);
+        }
+        if (unknown) ps->BatteryFlag = BATTERY_FLAG_UNKNOWN;
+    }
+#else
+    FIXME("Not implemented on this platform\n");
+#endif
+
+    return TRUE;
 }
 
 /***********************************************************************
-- 
2.23.0




More information about the wine-devel mailing list