-
-
Notifications
You must be signed in to change notification settings - Fork 74
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ef6f640
commit 1ad8e72
Showing
36 changed files
with
2,788 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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", ¤t_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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
|
Oops, something went wrong.