sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

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