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