]> git.sur5r.net Git - i3/i3status/blobdiff - src/print_battery_info.c
Merge pull request #333 from stapelberg/sysconfdir
[i3/i3status] / src / print_battery_info.c
index fa707146a0fe3d6679ad064a791350334715298d..1c516242aeed336e123c8240ef55fc7e92750fd7 100644 (file)
@@ -1,4 +1,5 @@
 // vim:ts=4:sw=4:expandtab
+#include <config.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -9,7 +10,7 @@
 
 #include "i3status.h"
 
-#if defined(LINUX)
+#if defined(__linux__)
 #include <errno.h>
 #include <glob.h>
 #include <sys/types.h>
@@ -75,7 +76,7 @@ static bool acpi_init(void) {
 }
 #endif
 
-#if defined(LINUX) || defined(__NetBSD__)
+#if defined(__linux__) || defined(__NetBSD__)
 /*
  * Add batt_info data to acc.
  */
@@ -132,7 +133,7 @@ static void add_battery_info(struct battery_info *acc, const struct battery_info
 static bool slurp_battery_info(struct battery_info *batt_info, yajl_gen json_gen, char *buffer, int number, const char *path, const char *format_down) {
     char *outwalk = buffer;
 
-#if defined(LINUX)
+#if defined(__linux__)
     char buf[1024];
     const char *walk, *last;
     bool watt_as_unit = false;
@@ -179,7 +180,7 @@ static bool slurp_battery_info(struct battery_info *batt_info, yajl_gen json_gen
             batt_info->status = CS_CHARGING;
         else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Full"))
             batt_info->status = CS_FULL;
-        else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Discharging"))
+        else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Discharging") || BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Not charging"))
             batt_info->status = CS_DISCHARGING;
         else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS="))
             batt_info->status = CS_UNKNOWN;
@@ -469,7 +470,7 @@ static bool slurp_battery_info(struct battery_info *batt_info, yajl_gen json_gen
  * Returns false on error, and an error message will have been written.
  */
 static bool slurp_all_batteries(struct battery_info *batt_info, yajl_gen json_gen, char *buffer, const char *path, const char *format_down) {
-#if defined(LINUX)
+#if defined(__linux__)
     char *outwalk = buffer;
     bool is_found = false;
 
@@ -497,14 +498,17 @@ static bool slurp_all_batteries(struct battery_info *batt_info, yajl_gen json_ge
                 .present_rate = 0,
                 .status = CS_UNKNOWN,
             };
-            if (!slurp_battery_info(&batt_buf, json_gen, buffer, i, globbuf.gl_pathv[i], format_down))
+            if (!slurp_battery_info(&batt_buf, json_gen, buffer, i, globbuf.gl_pathv[i], format_down)) {
+                globfree(&globbuf);
+                free(globpath);
                 return false;
+            }
 
             is_found = true;
             add_battery_info(batt_info, &batt_buf);
         }
+        globfree(&globbuf);
     }
-    globfree(&globbuf);
     free(globpath);
 
     if (!is_found) {
@@ -560,13 +564,13 @@ void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char
     // We prefer the design capacity, but use the last capacity if we don't have it,
     // or if we are asked to (last_full_capacity == true); but similarly we use
     // the design capacity if we don't have the last capacity.
-    // If we don't have either then both full_design and full_last < 0,
-    // which implies full < 0, which bails out on the following line.
+    // If we don't have either then both full_design and full_last <= 0,
+    // which implies full <= 0, which bails out on the following line.
     int full = batt_info.full_design;
-    if (full < 0 || (last_full_capacity && batt_info.full_last >= 0)) {
+    if (full <= 0 || (last_full_capacity && batt_info.full_last > 0)) {
         full = batt_info.full_last;
     }
-    if (full < 0 && batt_info.remaining < 0 && batt_info.percentage_remaining < 0) {
+    if (full <= 0 && batt_info.remaining < 0 && batt_info.percentage_remaining < 0) {
         /* We have no physical measurements and no estimates. Nothing
          * much we can report, then. */
         OUTPUT_FULL_TEXT(format_down);
@@ -619,10 +623,8 @@ void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char
 
         if (*walk != '%') {
             *(outwalk++) = *walk;
-            continue;
-        }
 
-        if (BEGINS_WITH(walk + 1, "status")) {
+        } else if (BEGINS_WITH(walk + 1, "status")) {
             const char *statusstr;
             switch (batt_info.status) {
                 case CS_CHARGING:
@@ -640,6 +642,7 @@ void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char
 
             outwalk += sprintf(outwalk, "%s", statusstr);
             walk += strlen("status");
+
         } else if (BEGINS_WITH(walk + 1, "percentage")) {
             if (integer_battery_capacity) {
                 outwalk += sprintf(outwalk, "%.00f%s", batt_info.percentage_remaining, pct_mark);
@@ -647,6 +650,7 @@ void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char
                 outwalk += sprintf(outwalk, "%.02f%s", batt_info.percentage_remaining, pct_mark);
             }
             walk += strlen("percentage");
+
         } else if (BEGINS_WITH(walk + 1, "remaining")) {
             if (batt_info.seconds_remaining >= 0) {
                 int seconds, hours, minutes;
@@ -665,6 +669,7 @@ void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char
             }
             walk += strlen("remaining");
             EAT_SPACE_FROM_OUTPUT_IF_NO_OUTPUT();
+
         } else if (BEGINS_WITH(walk + 1, "emptytime")) {
             if (batt_info.seconds_remaining >= 0) {
                 time_t empty_time = time(NULL) + batt_info.seconds_remaining;
@@ -680,12 +685,16 @@ void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char
             }
             walk += strlen("emptytime");
             EAT_SPACE_FROM_OUTPUT_IF_NO_OUTPUT();
+
         } else if (BEGINS_WITH(walk + 1, "consumption")) {
             if (batt_info.present_rate >= 0)
                 outwalk += sprintf(outwalk, "%1.2fW", batt_info.present_rate / 1e6);
 
             walk += strlen("consumption");
             EAT_SPACE_FROM_OUTPUT_IF_NO_OUTPUT();
+
+        } else {
+            *(outwalk++) = '%';
         }
     }