diff options
author | Christoph Lohmann <20h@r-36.net> | 2017-09-10 19:28:54 +0200 |
---|---|---|
committer | Christoph Lohmann <20h@r-36.net> | 2017-09-10 19:28:54 +0200 |
commit | a1751622782eb9d3d9bfae56b75b857d8cbd0c6c (patch) | |
tree | 903002f46f60ceb8afb7c26fc2ac409e8ab877aa /dwmstatus.c |
Initial commit.
Diffstat (limited to 'dwmstatus.c')
-rw-r--r-- | dwmstatus.c | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/dwmstatus.c b/dwmstatus.c new file mode 100644 index 0000000..9790212 --- /dev/null +++ b/dwmstatus.c @@ -0,0 +1,229 @@ +/* + * Copy me if you can. + * by 20h + */ + +#define _BSD_SOURCE +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <strings.h> +#include <sys/time.h> +#include <time.h> +#include <sys/types.h> +#include <sys/wait.h> + +#include <X11/Xlib.h> + +char *tzargentina = "America/Buenos_Aires"; +char *tzutc = "UTC"; +char *tzberlin = "Europe/Berlin"; + +static Display *dpy; + +char * +smprintf(char *fmt, ...) +{ + va_list fmtargs; + char *ret; + int len; + + va_start(fmtargs, fmt); + len = vsnprintf(NULL, 0, fmt, fmtargs); + va_end(fmtargs); + + ret = malloc(++len); + if (ret == NULL) { + perror("malloc"); + exit(1); + } + + va_start(fmtargs, fmt); + vsnprintf(ret, len, fmt, fmtargs); + va_end(fmtargs); + + return ret; +} + +void +settz(char *tzname) +{ + setenv("TZ", tzname, 1); +} + +char * +mktimes(char *fmt, char *tzname) +{ + char buf[129]; + time_t tim; + struct tm *timtm; + + settz(tzname); + tim = time(NULL); + timtm = localtime(&tim); + if (timtm == NULL) + return smprintf(""); + + if (!strftime(buf, sizeof(buf)-1, fmt, timtm)) { + fprintf(stderr, "strftime == 0\n"); + return smprintf(""); + } + + return smprintf("%s", buf); +} + +void +setstatus(char *str) +{ + XStoreName(dpy, DefaultRootWindow(dpy), str); + XSync(dpy, False); +} + +char * +loadavg(void) +{ + double avgs[3]; + + if (getloadavg(avgs, 3) < 0) + return smprintf(""); + + return smprintf("%.2f %.2f %.2f", avgs[0], avgs[1], avgs[2]); +} + +char * +readfile(char *base, char *file) +{ + char *path, line[513]; + FILE *fd; + + memset(line, 0, sizeof(line)); + + path = smprintf("%s/%s", base, file); + fd = fopen(path, "r"); + free(path); + if (fd == NULL) + return NULL; + + if (fgets(line, sizeof(line)-1, fd) == NULL) + return NULL; + fclose(fd); + + return smprintf("%s", line); +} + +char * +getbattery(char *base) +{ + char *co, status; + int descap, remcap; + + descap = -1; + remcap = -1; + + co = readfile(base, "present"); + if (co == NULL) + return smprintf(""); + if (co[0] != '1') { + free(co); + return smprintf("not present"); + } + free(co); + + co = readfile(base, "charge_full_design"); + if (co == NULL) { + co = readfile(base, "energy_full_design"); + if (co == NULL) + return smprintf(""); + } + sscanf(co, "%d", &descap); + free(co); + + co = readfile(base, "charge_now"); + if (co == NULL) { + co = readfile(base, "energy_now"); + if (co == NULL) + return smprintf(""); + } + sscanf(co, "%d", &remcap); + free(co); + + co = readfile(base, "status"); + if (!strncmp(co, "Discharging", 11)) { + status = '-'; + } else if(!strncmp(co, "Charging", 8)) { + status = '+'; + } else { + status = '?'; + } + + if (remcap < 0 || descap < 0) + return smprintf("invalid"); + + return smprintf("%.0f%%%c", ((float)remcap / (float)descap) * 100, status); +} + +char * +gettemperature(char *base, char *sensor) +{ + char *co; + + co = readfile(base, sensor); + if (co == NULL) + return smprintf(""); + return smprintf("%02.0f°C", atof(co) / 1000); +} + +int +main(void) +{ + char *status; + char *avgs; + char *bat; + char *bat1; + char *tmar; + char *tmutc; + char *tmbln; + char *t0, *t1, *t2, *t3; + + if (!(dpy = XOpenDisplay(NULL))) { + fprintf(stderr, "dwmstatus: cannot open display.\n"); + return 1; + } + + for (;;sleep(60)) { + avgs = loadavg(); + bat = getbattery("/sys/class/power_supply/BAT0"); + bat1 = getbattery("/sys/class/power_supply/BAT1"); + tmar = mktimes("%H:%M", tzargentina); + tmutc = mktimes("%H:%M", tzutc); + tmbln = mktimes("KW %W %a %d %b %H:%M %Z %Y", tzberlin); + t0 = gettemperature("/sys/devices/virtual/hwmon/hwmon1", "temp1_input"); + t1 = gettemperature("/sys/devices/platform/coretemp.0/hwmon/hwmon3", "temp1_input"); + t2 = gettemperature("/sys/devices/platform/coretemp.0/hwmon/hwmon3", "temp2_input"); + t3 = gettemperature("/sys/devices/platform/coretemp.0/hwmon/hwmon3", "temp3_input"); + + status = smprintf("T:%s|%s|%s|%s L:%s B:%s|%s A:%s U:%s %s", + t0, t1, t2, t3, avgs, bat, bat1, tmar, tmutc, + tmbln); + setstatus(status); + + free(t0); + free(t1); + free(t2); + free(t3); + free(avgs); + free(bat); + free(bat1); + free(tmar); + free(tmutc); + free(tmbln); + free(status); + } + + XCloseDisplay(dpy); + + return 0; +} + |