diff options
| -rw-r--r-- | status.c | 50 |
1 files changed, 45 insertions, 5 deletions
@@ -88,6 +88,7 @@ static char* battery_level_icon[] = { "", /* '\Uf0081' */ "", /* '\Uf0082' */ "", /* '\Uf0079' */ + "", /* '\Uf0084' */ }; static struct element statusbar[] = { @@ -128,21 +129,26 @@ element_date(char* buf, char* fmt) { struct battery_status get_battery_status(const char* buf) { const char path_prefix[] = "/sys/class/power_supply/"; + struct battery_status status = {.status = bat_unknown, .charge = -1}; char charge_path[128]; char capacity_path[128]; + char status_path[128]; char charge_str[512]; char capacity_str[512]; + char status_str[512]; int charge = 0; int capacity = 0; FILE* bat_charge; FILE* bat_capacity; + FILE* bat_status; memset(charge_path, 0, 128); memset(capacity_path, 0, 128); + memset(status_path, 0, 128); strcat(charge_path, path_prefix); strcat(charge_path, buf); @@ -152,17 +158,21 @@ get_battery_status(const char* buf) { strcat(capacity_path, buf); strcat(capacity_path, "/energy_full"); + strcat(status_path, path_prefix); + strcat(status_path, buf); + strcat(status_path, "/status"); + bat_charge = fopen(charge_path, "r"); if (!bat_charge) { - printf("%d: \"%s\" %s\n", errno, charge_path, strerror(errno)); - return (struct battery_status){bat_unknown, -1}; + fprintf(stderr, "%d: \"%s\" %s\n", errno, charge_path, strerror(errno)); + return status; } bat_capacity = fopen(capacity_path, "r"); if (!bat_capacity) { - printf("%d: \"%s\" %s\n", errno, capacity_path, strerror(errno)); + fprintf(stderr, "%d: \"%s\" %s\n", errno, capacity_path, strerror(errno)); fclose(bat_charge); - return (struct battery_status){bat_unknown, -1}; + return status; } fread(charge_str, sizeof(char), 512, bat_charge); @@ -173,8 +183,37 @@ get_battery_status(const char* buf) { charge = atoi(charge_str); capacity = atoi(capacity_str); + status.charge = (float)charge / capacity; + + // Get battery status + bat_status = fopen(status_path, "r"); + if (!bat_status) { + fprintf(stderr, "%d: \"%s\" %s\n", errno, status_path, strerror(errno)); + return status; + } + + fread(status_str, sizeof(char), 512, bat_status); + fclose(bat_status); + + // Remove trailing newline + for (int i = 0; i < 512; i++) { + if (status_str[i] == '\n') { + status_str[i] = '\0'; + break; + } + } + + if (!strcmp(status_str, "Charging")) { + status.status = bat_charging; + } + else if (!strcmp(status_str, "Discharging")) { + status.status = bat_discharging; + } + else if (!strcmp(status_str, "Not charging")) { + status.status = bat_not_charging; + } - return (struct battery_status){bat_unknown, (float)charge / capacity}; + return status; } int @@ -182,6 +221,7 @@ element_battery(char* buf, char* bat) { struct battery_status s = get_battery_status(bat); int batlvl = (int)(s.charge * 100.f) / 10; + if (s.status == bat_charging) batlvl = 11; char* batlvl_icon = battery_level_icon[batlvl]; snprintf(buf, ELEMENT_STRBUF_SZ, "%s %.1f%%", batlvl_icon, 100.f * s.charge); |
