slstatus-dyn_battery-20250414-f68f492.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
slstatus-dyn_battery-20250414-f68f492.diff (4376B)
---
1 From b96a72c277a72c77feaf94fac679f3ea87f78ea6 Mon Sep 17 00:00:00 2001
2 From: Madison Lynch <madi@mxdi.xyz>
3 Date: Mon, 14 Apr 2025 21:04:23 -0700
4 Subject: [PATCH] Created dyn-battery patch, for displaying status of multiple
5 batteries
6
7 ---
8 Makefile | 1 +
9 components/dyn_battery.c | 77 ++++++++++++++++++++++++++++++++++++++++
10 config.def.h | 4 +++
11 slstatus.h | 3 ++
12 4 files changed, 85 insertions(+)
13 create mode 100644 components/dyn_battery.c
14
15 diff --git a/Makefile b/Makefile
16 index 7a18274..d1b24dd 100644
17 --- a/Makefile
18 +++ b/Makefile
19 @@ -11,6 +11,7 @@ COM =\
20 components/cpu\
21 components/datetime\
22 components/disk\
23 + components/dyn_battery\
24 components/entropy\
25 components/hostname\
26 components/ip\
27 diff --git a/components/dyn_battery.c b/components/dyn_battery.c
28 new file mode 100644
29 index 0000000..2e58351
30 --- /dev/null
31 +++ b/components/dyn_battery.c
32 @@ -0,0 +1,77 @@
33 +/* Written by Madison Lynch <madi@mxdi.xyz> */
34 +/* Only Linux is supported */
35 +#include <stdio.h>
36 +#include <stdlib.h>
37 +#include <string.h>
38 +#include <dirent.h>
39 +
40 +#include "../slstatus.h"
41 +
42 +#define BAT_PREFIX "BAT"
43 +#define BAT_DIR "/sys/class/power_supply"
44 +
45 +/**
46 +* Counts number of batteries detected by system.
47 +*
48 +* @return unsigned integer denoting the number of detected batteries.
49 +* @author Madison Lynch
50 +*/
51 +static unsigned int
52 +battery_count(void) {
53 + DIR *dir = opendir(BAT_DIR);
54 + unsigned int bat_c = 0;
55 +
56 + struct dirent *entry;
57 + while((entry = readdir(dir)))
58 + if(strlen(entry->d_name) > 3)
59 + if(strncmp(entry->d_name, BAT_PREFIX, 3) == 0)
60 + bat_c++;
61 +
62 + (void) closedir(dir);
63 + return bat_c;
64 +}
65 +
66 +/**
67 +* Displays the status and capacity of a dynamic amount of batteries (i.e.
68 +* laptop may have secondary external battery).
69 +*
70 +* @param fmt format string to use for each battery display. ordered key:
71 +* %u: battery number || %s: battery state || %s battery capacity
72 +* @return string containing the status and capacities of all detected batteries
73 +* @author Madison Lynch
74 +*/
75 +const char *
76 +dyn_battery(const char *fmt) {
77 + const size_t fmt_s = strlen(fmt);
78 + const unsigned int bat_c = battery_count();
79 +
80 + // Extra byte in calloc() for null byte
81 + char *output = (char *)calloc(fmt_s * bat_c + 1, sizeof(char));
82 + unsigned int displacement = 0; // For appending battery displays
83 + for(unsigned int i=0; i<bat_c; i++) {
84 + char bat[7]; // "BAT" = 3 + <=3 digit number + null byte
85 + sprintf(bat, "BAT%u", i);
86 +
87 + // Add battery display to final string to be returned
88 + sprintf(
89 + output + displacement,
90 + fmt,
91 + i,
92 + battery_state(bat),
93 + battery_perc(bat)
94 + );
95 + displacement = strlen(output);
96 +
97 + // Add space between battery displays
98 + *(output + displacement) = ' ';
99 + displacement++;
100 + }
101 +
102 + // Remove extra space after last battery display
103 + output[--displacement] = 0x00;
104 +
105 + return output;
106 +}
107 +
108 +#undef BAT_DIR
109 +#undef BAT_PREFIX
110 diff --git a/config.def.h b/config.def.h
111 index d805331..967d63d 100644
112 --- a/config.def.h
113 +++ b/config.def.h
114 @@ -26,6 +26,10 @@ static const char unknown_str[] = "n/a";
115 * disk_perc disk usage in percent mountpoint path (/)
116 * disk_total total disk space in GB mountpoint path (/)
117 * disk_used used disk space in GB mountpoint path (/)
118 + * dyn_battery displays the name, state and format string (%u, %s,
119 + * capacity of all detected %s). order is important,
120 + * batteries and matches description.
121 + * (Linux only)
122 * entropy available entropy NULL
123 * gid GID of current user NULL
124 * hostname hostname NULL
125 diff --git a/slstatus.h b/slstatus.h
126 index 8ef5874..44a4b61 100644
127 --- a/slstatus.h
128 +++ b/slstatus.h
129 @@ -21,6 +21,9 @@ const char *disk_perc(const char *path);
130 const char *disk_total(const char *path);
131 const char *disk_used(const char *path);
132
133 +/* dyn_battery */
134 +const char *dyn_battery(const char *fmt);
135 +
136 /* entropy */
137 const char *entropy(const char *unused);
138
139 --
140 2.49.0
141