t* dwmstatus for OpenBSD URI git clone git://git.codevoid.de/dwmstatus-sdk DIR Log DIR Files DIR Refs DIR LICENSE --- DIR commit e276c5ff75309f5a904bea54427f5bd871527f8b DIR parent 813aed994aac60d514a3387d3346b0d05c5a3257 URI Author: Stefan Hagen <sh+git[at]codevoid[dot]de> Date: Mon, 21 May 2018 11:02:31 +0200 Adding USR1 signal handler to force update status Diffstat: M dwmstatus.c | 76 +++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 24 deletions(-) --- DIR diff --git a/dwmstatus.c b/dwmstatus.c t@@ -17,6 +17,7 @@ #include <sys/types.h> #include <sys/sysctl.h> #include <sys/wait.h> +#include <signal.h> #include <fcntl.h> #include <sys/soundcard.h> t@@ -86,7 +87,6 @@ getsysctl(char *input_str) { char * getvolume(char *mixerpath) { char defaultmixer[] = "/dev/mixer"; - char *ret_val; int mixfd, vol, devmask = 0; if (mixerpath == NULL) t@@ -235,41 +235,69 @@ gettemperature(char *base, char *sensor) return smprintf("%02.0f°C", atof(co) / 1000); } -int -main(void) -{ + +// update all values and print statusbar +void update() { char *status; char *datetime; char *cputemp; char *battery; char *volume; + // cpu temperature + cputemp = smprintf("%i", ZEROCTOC((int)getsysctl("hw.acpi.thermal.tz0.temperature"))); + + // battery + battery = smprintf("%i", getsysctl("hw.acpi.battery.life")); + + // audio volume + volume = smprintf("%s", getvolume("/dev/mixer")); + + // IP + (lan speed / wlan ssid) + // TBD + + // free disk space (root/home) + // TBD + + // date and time + datetime = mktimes("%d.%m.%Y %H:%M", tzberlin); + + // assemble and display + status = smprintf(" CPU:%s°C BAT:%s%% VOL:%s | %s ", cputemp, battery, volume, datetime); + setstatus(status); + + free(volume); + free(battery); + free(cputemp); + free(datetime); + free(status); +} + + +// A user might want to force update dwmstatus (for example after a +// changing the volume. This can be done by sending signal SIGUSR1. +void +sig_handler(int signo) { + if (signo == SIGUSR1) + update(); +} + +int +main(void) +{ + if (!(dpy = XOpenDisplay(NULL))) { fprintf(stderr, "dwmstatus: cannot open display.\n"); return 1; } + // register signal handler + if (signal(SIGUSR1, sig_handler) == SIG_ERR) + fprintf(stderr, "Err: can't register SIGUSR1\n"); + + // update status for (;;sleep(60)) { - // cpu temperature - cputemp = smprintf("%i", ZEROCTOC((int)getsysctl("hw.acpi.thermal.tz0.temperature"))); - // battery - battery = smprintf("%i", getsysctl("hw.acpi.battery.life")); - // audio volume - volume = smprintf("%s", getvolume("/dev/mixer")); - // IP + (lan speed / wlan ssid) - // free disk space (root/home) - // date and time: done - datetime = mktimes("%d.%m.%Y %H:%M", tzberlin); - - // assemble and display - status = smprintf(" CPU:%s°C BAT:%s%% VOL:%s | %s ", cputemp, battery, volume, datetime); - setstatus(status); - - free(volume); - free(battery); - free(cputemp); - free(datetime); - free(status); + update(); } XCloseDisplay(dpy);