summaryrefslogtreecommitdiff
path: root/batwarn_daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'batwarn_daemon.c')
-rw-r--r--batwarn_daemon.c51
1 files changed, 35 insertions, 16 deletions
diff --git a/batwarn_daemon.c b/batwarn_daemon.c
index 1cd1d17..e7d6129 100644
--- a/batwarn_daemon.c
+++ b/batwarn_daemon.c
@@ -14,7 +14,9 @@
// Warning when battery percentage is <= this
-static const int WARN_PERC = 10;
+static const int WARN_LO = 10;
+// Warning when battery percentage is >= this (only warns once per charge cycle)
+static const int WARN_HI = 65;
// Time to sleep between checks
static const struct timespec SLEEP_SPEC = {60, 0};
@@ -38,6 +40,28 @@ static inline void parse(const char *buffer, bool *discharging, int *charge, int
}
}
+static void show_nagbar(int percentage, const char *nagtype) {
+ pid_t pid = fork();
+ if (pid < 0) perror("fork");
+ else if (pid == 0) {
+ char msg[strlen(MESSAGE_FORMAT) + 16];
+ snprintf(msg, sizeof msg, MESSAGE_FORMAT, percentage);
+
+ char nagtypebuf[16];
+ assert(strlen(nagtype) < sizeof nagtypebuf);
+ strcpy(nagtypebuf, nagtype);
+
+ char *argv[6] = {"i3-nagbar", "-m", msg, "-t", nagtypebuf, NULL};
+ execv("/usr/bin/i3-nagbar", argv);
+ perror("execv");
+ exit(255);
+ } else {
+ int status;
+ do if (waitpid(pid, &status, 0) < 0 && errno == ECHILD) break;
+ while (!WIFEXITED(status) && !WIFSIGNALED(status));
+ }
+}
+
int main(void) {
int fd = open("/sys/class/power_supply/BAT1/uevent", O_RDONLY);
if (fd < 0) {
@@ -47,6 +71,8 @@ int main(void) {
char buffer[1024];
+ bool prev_less_than_hi = false;
+
while (true) {
ssize_t nr = pread(fd, buffer, sizeof buffer, 0);
if (nr < 0) {
@@ -57,22 +83,15 @@ int main(void) {
bool discharging = false;
int charge = 1, full = 1;
parse(buffer, &discharging, &charge, &full);
+ int percentage = charge * 100 / full;
- if (full > 0 && discharging && charge * 100 / full <= WARN_PERC) {
- pid_t pid = fork();
- if (pid < 0) perror("fork");
- else if (pid == 0) {
- char msg[strlen(MESSAGE_FORMAT) + 16];
- snprintf(msg, sizeof msg, MESSAGE_FORMAT, charge * 100 / full);
- char *argv[4] = {"i3-nagbar", "-m", msg, NULL};
- execv("/usr/bin/i3-nagbar", argv);
- perror("execv");
- exit(255);
- } else {
- int status;
- do if (waitpid(pid, &status, 0) < 0 && errno == ECHILD) break;
- while (!WIFEXITED(status) && !WIFSIGNALED(status));
- }
+ if (full > 0 && discharging && percentage <= WARN_LO) {
+ show_nagbar(percentage, "error");
+ } else if (percentage < WARN_HI) {
+ prev_less_than_hi = true;
+ } else if (prev_less_than_hi) {
+ prev_less_than_hi = false;
+ show_nagbar(percentage, "warning");
}
(void)nanosleep(&SLEEP_SPEC, NULL);