Skip to content

Commit

Permalink
add slstatus
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisTitusTech committed Aug 15, 2024
1 parent ef6f640 commit 1ad8e72
Show file tree
Hide file tree
Showing 36 changed files with 2,788 additions and 0 deletions.
1 change: 1 addition & 0 deletions config.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ static Key keys[] = {
{ MODKEY|ControlMask, XK_p, spawn, SHCMD ("flameshot gui --clipboard")}, // copy screenshot to clipboard
{ MODKEY, XK_e, spawn, SHCMD ("thunar")}, // open thunar file manager
{ MODKEY, XK_w, spawn, SHCMD ("looking-glass-client -F")}, // start Looking glass
{ MODKEY|ShiftMask, XK_w, spawn, SHCMD ("feh --randomize --bg-fill /home/titus/Pictures/backgrounds/*")}, // start Looking glass
{ 0, 0x1008ff02, spawn, SHCMD ("xbacklight -inc 10")}, // increase backlight brightness
{ 0, 0x1008ff03, spawn, SHCMD ("xbacklight -dec 10")}, // decrease backlight brightness
{ 0, 0x1008ff1b, spawn, SHCMD ("xbacklight -inc 10")}, // increase backlight brightness
Expand Down
Binary file modified release/dwm
Binary file not shown.
Binary file modified release/dwm-6.5.tar.gz
Binary file not shown.
69 changes: 69 additions & 0 deletions slstatus/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# See LICENSE file for copyright and license details
# slstatus - suckless status monitor
.POSIX:

include config.mk

REQ = util
COM =\
components/battery\
components/cat\
components/cpu\
components/datetime\
components/disk\
components/entropy\
components/hostname\
components/ip\
components/kernel_release\
components/keyboard_indicators\
components/keymap\
components/load_avg\
components/netspeeds\
components/num_files\
components/ram\
components/run_command\
components/swap\
components/temperature\
components/uptime\
components/user\
components/volume\
components/wifi

all: slstatus

$(COM:=.o): config.mk $(REQ:=.h) slstatus.h
slstatus.o: slstatus.c slstatus.h arg.h config.h config.mk $(REQ:=.h)

.c.o:
$(CC) -o $@ -c $(CPPFLAGS) $(CFLAGS) $<

config.h:
cp config.def.h $@

slstatus: slstatus.o $(COM:=.o) $(REQ:=.o)
$(CC) -o $@ $(LDFLAGS) $(COM:=.o) $(REQ:=.o) slstatus.o $(LDLIBS)

clean:
rm -f slstatus slstatus.o $(COM:=.o) $(REQ:=.o) slstatus-${VERSION}.tar.gz

dist:
rm -rf "slstatus-$(VERSION)"
mkdir -p "slstatus-$(VERSION)/components"
cp -R LICENSE Makefile README config.mk config.def.h \
arg.h slstatus.h slstatus.c $(REQ:=.c) $(REQ:=.h) \
slstatus.1 "slstatus-$(VERSION)"
cp -R $(COM:=.c) "slstatus-$(VERSION)/components"
tar -cf - "slstatus-$(VERSION)" | gzip -c > "slstatus-$(VERSION).tar.gz"
rm -rf "slstatus-$(VERSION)"

install: all
mkdir -p "$(DESTDIR)$(PREFIX)/bin"
cp -f slstatus "$(DESTDIR)$(PREFIX)/bin"
chmod 755 "$(DESTDIR)$(PREFIX)/bin/slstatus"
mkdir -p "$(DESTDIR)$(MANPREFIX)/man1"
cp -f slstatus.1 "$(DESTDIR)$(MANPREFIX)/man1"
chmod 644 "$(DESTDIR)$(MANPREFIX)/man1/slstatus.1"

uninstall:
rm -f "$(DESTDIR)$(PREFIX)/bin/slstatus"
rm -f "$(DESTDIR)$(MANPREFIX)/man1/slstatus.1"
33 changes: 33 additions & 0 deletions slstatus/arg.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/* See LICENSE file for copyright and license details. */
#ifndef ARG_H
#define ARG_H

extern char *argv0;

/* int main(int argc, char *argv[]) */
#define ARGBEGIN for (argv0 = *argv, *argv ? (argc--, argv++) : ((void *)0); \
*argv && (*argv)[0] == '-' && (*argv)[1]; argc--, argv++) { \
int i_, argused_; \
if ((*argv)[1] == '-' && !(*argv)[2]) { \
argc--, argv++; \
break; \
} \
for (i_ = 1, argused_ = 0; (*argv)[i_]; i_++) { \
switch ((*argv)[i_])
#define ARGEND if (argused_) { \
if ((*argv)[i_ + 1]) { \
break; \
} else { \
argc--, argv++; \
break; \
} \
} \
} \
}
#define ARGC() ((*argv)[i_])
#define ARGF_(x) (((*argv)[i_ + 1]) ? (argused_ = 1, &((*argv)[i_ + 1])) : \
(*(argv + 1)) ? (argused_ = 1, *(argv + 1)) : (x))
#define EARGF(x) ARGF_(((x), exit(1), (char *)0))
#define ARGF() ARGF_((char *)0)

#endif
247 changes: 247 additions & 0 deletions slstatus/components/battery.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,247 @@
/* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <string.h>

#include "../slstatus.h"
#include "../util.h"

#if defined(__linux__)
/*
* https://www.kernel.org/doc/html/latest/power/power_supply_class.html
*/
#include <limits.h>
#include <stdint.h>
#include <unistd.h>

#define POWER_SUPPLY_CAPACITY "/sys/class/power_supply/%s/capacity"
#define POWER_SUPPLY_STATUS "/sys/class/power_supply/%s/status"
#define POWER_SUPPLY_CHARGE "/sys/class/power_supply/%s/charge_now"
#define POWER_SUPPLY_ENERGY "/sys/class/power_supply/%s/energy_now"
#define POWER_SUPPLY_CURRENT "/sys/class/power_supply/%s/current_now"
#define POWER_SUPPLY_POWER "/sys/class/power_supply/%s/power_now"

static const char *
pick(const char *bat, const char *f1, const char *f2, char *path,
size_t length)
{
if (esnprintf(path, length, f1, bat) > 0 &&
access(path, R_OK) == 0)
return f1;

if (esnprintf(path, length, f2, bat) > 0 &&
access(path, R_OK) == 0)
return f2;

return NULL;
}

const char *
battery_perc(const char *bat)
{
int cap_perc;
char path[PATH_MAX];

if (esnprintf(path, sizeof(path), POWER_SUPPLY_CAPACITY, bat) < 0)
return NULL;
if (pscanf(path, "%d", &cap_perc) != 1)
return NULL;

return bprintf("%d", cap_perc);
}

const char *
battery_state(const char *bat)
{
static struct {
char *state;
char *symbol;
} map[] = {
{ "Charging", "+" },
{ "Discharging", "-" },
{ "Full", "o" },
{ "Not charging", "o" },
};
size_t i;
char path[PATH_MAX], state[12];

if (esnprintf(path, sizeof(path), POWER_SUPPLY_STATUS, bat) < 0)
return NULL;
if (pscanf(path, "%12[a-zA-Z ]", state) != 1)
return NULL;

for (i = 0; i < LEN(map); i++)
if (!strcmp(map[i].state, state))
break;

return (i == LEN(map)) ? "?" : map[i].symbol;
}

const char *
battery_remaining(const char *bat)
{
uintmax_t charge_now, current_now, m, h;
double timeleft;
char path[PATH_MAX], state[12];

if (esnprintf(path, sizeof(path), POWER_SUPPLY_STATUS, bat) < 0)
return NULL;
if (pscanf(path, "%12[a-zA-Z ]", state) != 1)
return NULL;

if (!pick(bat, POWER_SUPPLY_CHARGE, POWER_SUPPLY_ENERGY, path,
sizeof(path)) ||
pscanf(path, "%ju", &charge_now) < 0)
return NULL;

if (!strcmp(state, "Discharging")) {
if (!pick(bat, POWER_SUPPLY_CURRENT, POWER_SUPPLY_POWER, path,
sizeof(path)) ||
pscanf(path, "%ju", &current_now) < 0)
return NULL;

if (current_now == 0)
return NULL;

timeleft = (double)charge_now / (double)current_now;
h = timeleft;
m = (timeleft - (double)h) * 60;

return bprintf("%juh %jum", h, m);
}

return "";
}
#elif defined(__OpenBSD__)
#include <fcntl.h>
#include <machine/apmvar.h>
#include <sys/ioctl.h>
#include <unistd.h>

static int
load_apm_power_info(struct apm_power_info *apm_info)
{
int fd;

fd = open("/dev/apm", O_RDONLY);
if (fd < 0) {
warn("open '/dev/apm':");
return 0;
}

memset(apm_info, 0, sizeof(struct apm_power_info));
if (ioctl(fd, APM_IOC_GETPOWER, apm_info) < 0) {
warn("ioctl 'APM_IOC_GETPOWER':");
close(fd);
return 0;
}
return close(fd), 1;
}

const char *
battery_perc(const char *unused)
{
struct apm_power_info apm_info;

if (load_apm_power_info(&apm_info))
return bprintf("%d", apm_info.battery_life);

return NULL;
}

const char *
battery_state(const char *unused)
{
struct {
unsigned int state;
char *symbol;
} map[] = {
{ APM_AC_ON, "+" },
{ APM_AC_OFF, "-" },
};
struct apm_power_info apm_info;
size_t i;

if (load_apm_power_info(&apm_info)) {
for (i = 0; i < LEN(map); i++)
if (map[i].state == apm_info.ac_state)
break;

return (i == LEN(map)) ? "?" : map[i].symbol;
}

return NULL;
}

const char *
battery_remaining(const char *unused)
{
struct apm_power_info apm_info;
unsigned int h, m;

if (load_apm_power_info(&apm_info)) {
if (apm_info.ac_state != APM_AC_ON) {
h = apm_info.minutes_left / 60;
m = apm_info.minutes_left % 60;
return bprintf("%uh %02um", h, m);
} else {
return "";
}
}

return NULL;
}
#elif defined(__FreeBSD__)
#include <sys/sysctl.h>

#define BATTERY_LIFE "hw.acpi.battery.life"
#define BATTERY_STATE "hw.acpi.battery.state"
#define BATTERY_TIME "hw.acpi.battery.time"

const char *
battery_perc(const char *unused)
{
int cap_perc;
size_t len;

len = sizeof(cap_perc);
if (sysctlbyname(BATTERY_LIFE, &cap_perc, &len, NULL, 0) < 0 || !len)
return NULL;

return bprintf("%d", cap_perc);
}

const char *
battery_state(const char *unused)
{
int state;
size_t len;

len = sizeof(state);
if (sysctlbyname(BATTERY_STATE, &state, &len, NULL, 0) < 0 || !len)
return NULL;

switch (state) {
case 0: /* FALLTHROUGH */
case 2:
return "+";
case 1:
return "-";
default:
return "?";
}
}

const char *
battery_remaining(const char *unused)
{
int rem;
size_t len;

len = sizeof(rem);
if (sysctlbyname(BATTERY_TIME, &rem, &len, NULL, 0) < 0 || !len
|| rem < 0)
return NULL;

return bprintf("%uh %02um", rem / 60, rem % 60);
}
#endif
32 changes: 32 additions & 0 deletions slstatus/components/cat.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <string.h>

#include "../slstatus.h"
#include "../util.h"

const char *
cat(const char *path)
{
char *f;
FILE *fp;

if (!(fp = fopen(path, "r"))) {
warn("fopen '%s':", path);
return NULL;
}

f = fgets(buf, sizeof(buf) - 1, fp);
if (fclose(fp) < 0) {
warn("fclose '%s':", path);
return NULL;
}
if (!f)
return NULL;

if ((f = strrchr(buf, '\n')))
f[0] = '\0';

return buf[0] ? buf : NULL;
}

Loading

0 comments on commit 1ad8e72

Please sign in to comment.