slstatus-battery-notify-20240127-a56a0a5.diff (3781B)
1 From a56a0a5f8314caa21b2e3ce9be8537134ac67bfe Mon Sep 17 00:00:00 2001 2 From: keroles <keroles971005@gmail.com> 3 Date: Sat, 27 Jan 2024 22:36:01 +0200 4 Subject: [PATCH] add stdlib and some comments for battery notify patch: 5 6 --- 7 components/battery.c | 50 ++++++++++++++++++++++++++++++++++++++++++++ 8 config.def.h | 11 ++++++++++ 9 slstatus.h | 1 + 10 3 files changed, 62 insertions(+) 11 12 diff --git a/components/battery.c b/components/battery.c 13 index 1c753f9..f97db41 100644 14 --- a/components/battery.c 15 +++ b/components/battery.c 16 @@ -1,6 +1,7 @@ 17 /* See LICENSE file for copyright and license details. */ 18 #include <stdio.h> 19 #include <string.h> 20 +#include <stdlib.h> 21 22 #include "../slstatus.h" 23 #include "../util.h" 24 @@ -20,6 +21,12 @@ 25 #define POWER_SUPPLY_CURRENT "/sys/class/power_supply/%s/current_now" 26 #define POWER_SUPPLY_POWER "/sys/class/power_supply/%s/power_now" 27 28 + const char notify_cmd[] = "notify-send"; 29 + const char battery_str[] = "Battery"; 30 + int last_notified_level = 0; 31 + 32 + extern const int notifiable_levels[]; 33 + 34 static const char * 35 pick(const char *bat, const char *f1, const char *f2, char *path, 36 size_t length) 37 @@ -49,6 +56,49 @@ 38 return bprintf("%d", cap_perc); 39 } 40 41 + void battery_notify(const char *bat) 42 +{ 43 + int cap_perc; 44 + char state[12]; 45 + char path[PATH_MAX]; 46 + 47 + if (esnprintf(path, sizeof(path), POWER_SUPPLY_CAPACITY, bat) < 0 || pscanf(path, "%d", &cap_perc) != 1) 48 + return; 49 + 50 + if (esnprintf(path, sizeof(path), POWER_SUPPLY_STATUS, bat) < 0 || pscanf(path, "%12[a-zA-Z ]", &state) != 1) 51 + return; 52 + 53 + if (strcmp("Charging", state) == 0) 54 + { 55 + last_notified_level = 0; 56 + 57 + return; 58 + } 59 + 60 + if (strcmp("Discharging", state) != 0) 61 + return; 62 + 63 + size_t i; 64 + const int size = sizeof(*notifiable_levels); 65 + char cmd[28]; 66 + 67 + for (i = 0; i < size; i++) 68 + { 69 + if (notifiable_levels[i] != cap_perc) 70 + continue; 71 + 72 + if (notifiable_levels[i] != last_notified_level) 73 + { 74 + last_notified_level = notifiable_levels[i]; 75 + 76 + snprintf(cmd, 100, "%s %s %d%%", notify_cmd, battery_str, cap_perc); 77 + system(cmd); 78 + 79 + break; 80 + } 81 + } 82 +} 83 + 84 const char * 85 battery_state(const char *bat) 86 { 87 diff --git a/config.def.h b/config.def.h 88 index d805331..35d5aa0 100644 89 --- a/config.def.h 90 +++ b/config.def.h 91 @@ -9,11 +9,20 @@ static const char unknown_str[] = "n/a"; 92 /* maximum output string length */ 93 #define MAXLEN 2048 94 95 +/* battery levels to notify - add any levels you want to receive notification for (in percent) */ 96 +const int notifiable_levels[] = { 97 + 20, 98 + 10, 99 + 5, 100 +}; 101 + 102 /* 103 * function description argument (example) 104 * 105 * battery_perc battery percentage battery name (BAT0) 106 * NULL on OpenBSD/FreeBSD 107 + * battery_notify linux battery notifications battery name (BAT0) 108 + * OpenBSD/FreeBSD not supported 109 * battery_remaining battery remaining HH:MM battery name (BAT0) 110 * NULL on OpenBSD/FreeBSD 111 * battery_state battery charging state battery name (BAT0) 112 @@ -66,4 +75,6 @@ static const char unknown_str[] = "n/a"; 113 static const struct arg args[] = { 114 /* function format argument */ 115 { datetime, "%s", "%F %T" }, 116 + { battery_notify, "", "BAT0"}, /* There is nothing to print its just a notifications*/ 117 + 118 }; 119 diff --git a/slstatus.h b/slstatus.h 120 index 8ef5874..bb80b23 100644 121 --- a/slstatus.h 122 +++ b/slstatus.h 123 @@ -2,6 +2,7 @@ 124 125 /* battery */ 126 const char *battery_perc(const char *); 127 +void battery_notify(const char *); 128 const char *battery_remaining(const char *); 129 const char *battery_state(const char *); 130 131 -- 132 2.43.0 133