]> git.sur5r.net Git - i3/i3status/blobdiff - src/get_battery_info.c
Add debian changelog entry to keep updates from overwriting local versions
[i3/i3status] / src / get_battery_info.c
index b81eb8e96681debec36346eb6f12f2fabb4877d1..ee7870665ae887e897207a1f2d4e047da1146fbc 100644 (file)
@@ -1,9 +1,15 @@
+// vim:ts=8:expandtab
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
 
 #include "i3status.h"
 
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#endif
+
 /*
  * Get battery information from /sys. Note that it uses the design capacity to
  * calculate the percentage, not the last full capacity, so you can see how
@@ -19,7 +25,9 @@ const char *get_battery_info(struct battery *bat) {
             present_rate = -1;
         charging_status_t status = CS_DISCHARGING;
 
-       slurp(bat->path, buf, sizeof(buf));
+#if defined(LINUX)
+        if (!slurp(bat->path, buf, sizeof(buf)))
+                return "No battery";
 
         for (walk = buf, last = buf; (walk-buf) < 1024; walk++) {
                 if (*walk == '\n') {
@@ -84,5 +92,48 @@ const char *get_battery_info(struct battery *bat) {
                          (status == CS_DISCHARGING ? "BAT" : "FULL")),
                         (((float)remaining / (float)full_design) * 100));
         }
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+        int state;
+        int sysctl_rslt;
+        size_t sysctl_size = sizeof(sysctl_rslt);
+
+        if (sysctlbyname(BATT_LIFE, &sysctl_rslt, &sysctl_size, NULL, 0) != 0)
+                return "No battery";
+
+        present_rate = sysctl_rslt;
+        if (sysctlbyname(BATT_TIME, &sysctl_rslt, &sysctl_size, NULL, 0) != 0)
+                return "No battery";
+
+        remaining = sysctl_rslt;
+        if (sysctlbyname(BATT_STATE, &sysctl_rslt, &sysctl_size, NULL,0) != 0)
+                return "No battery";
+
+        state = sysctl_rslt;
+        if (state == 0 && present_rate == 100)
+                status = CS_FULL;
+        else if (state == 0 && present_rate < 100)
+                status = CS_CHARGING;
+        else
+                status = CS_DISCHARGING;
+
+        full_design = sysctl_rslt;
+
+        if (state == 1) {
+                int hours, minutes;
+                minutes = remaining;
+                hours = minutes / 60;
+                minutes -= (hours * 60);
+                (void)snprintf(part, sizeof(part), "%s %02d%% %02dh%02d",
+                               (status == CS_CHARGING ? "CHR" :
+                                (status == CS_DISCHARGING ? "BAT" : "FULL")),
+                               present_rate,
+                               max(hours, 0), max(minutes, 0));
+        } else {
+                (void)snprintf(part, sizeof(part), "%s %02d%%",
+                               (status == CS_CHARGING ? "CHR" :
+                                (status == CS_DISCHARGING ? "BAT" : "FULL")),
+                               present_rate);
+        }
+#endif
         return part;
 }