summaryrefslogtreecommitdiff
path: root/status.c
diff options
context:
space:
mode:
Diffstat (limited to 'status.c')
-rw-r--r--status.c50
1 files changed, 45 insertions, 5 deletions
diff --git a/status.c b/status.c
index 9e77bdb..96ba796 100644
--- a/status.c
+++ b/status.c
@@ -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);