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