t* dwmstatus for OpenBSD
URI git clone git://git.codevoid.de/dwmstatus-sdk
DIR Log
DIR Files
DIR Refs
DIR LICENSE
---
DIR commit e591bf9a6df8ae266b612bacec9e407fc9c4c1f7
DIR parent dd54568f6cfe3ee35e7b62546ee886ad49136083
URI Author: Stefan Hagen <sh+git[at]codevoid[dot]de>
Date: Fri, 23 Nov 2018 20:24:38 +0100
Update 2018-11-23 20:24 OpenBSD/amd64
Diffstat:
M dwmstatus.c | 60 ++++++++++++++++++++++++++------
1 file changed, 50 insertions(+), 10 deletions(-)
---
DIR diff --git a/dwmstatus.c b/dwmstatus.c
t@@ -12,6 +12,9 @@
#include <time.h>
#include <sys/types.h>
#include <sys/sysctl.h>
+#include <sys/ioctl.h>
+#include <sys/audioio.h>
+#include <sys/socket.h>
#include <sys/wait.h>
#include <signal.h>
#include <fcntl.h>
t@@ -63,17 +66,54 @@ char * getfreespace(const char *path) {
return smprintf("%ld", (vfs.f_bavail * vfs.f_bsize) / 1024 / 1024);
}
-char * getsysctl(char *input_str) {
- char *ret_val;
- size_t ret_size;
-
- return "not implemented";
+//char * getsysctl(char *input_str) {
+// char *ret_val;
+// size_t ret_size;
+//
+// return "not implemented";
+//}
+
+char * getvolume() {
+
+ static int cls = -1, fd, v;
+ static struct mixer_devinfo mdi;
+ static struct mixer_ctrl mc;
+
+ if ((fd = open("/dev/mixer", O_RDONLY)) == -1)
+ return smprintf("NOMIXER");
+
+ for (mdi.index = 0; cls == -1; ++mdi.index) {
+ if (ioctl(fd, AUDIO_MIXER_DEVINFO, &mdi) == -1)
+ goto fail;
+ if (mdi.type == AUDIO_MIXER_CLASS &&
+ strcmp(mdi.label.name, AudioCoutputs) == 0)
+ cls = mdi.index;
+ }
+ for (mdi.index = 0, v = -1; v == -1; ++mdi.index) {
+ if (ioctl(fd, AUDIO_MIXER_DEVINFO, &mdi) == -1)
+ goto fail;
+ if (mdi.type == AUDIO_MIXER_VALUE &&
+ mdi.prev == AUDIO_MIXER_LAST &&
+ mdi.mixer_class == cls &&
+ strcmp(mdi.label.name, AudioNmaster) == 0) {
+ mc.dev = mdi.index;
+ if (ioctl(fd, AUDIO_MIXER_READ, &mc) == -1)
+ goto fail;
+ v = MAX(mc.un.value.level[AUDIO_MIXER_LEVEL_MONO],
+ mc.un.value.level[AUDIO_MIXER_LEVEL_RIGHT]);
+ }
+ }
+
+ if (v == -1 || close(fd) == -1)
+ return smprintf("NOCHAN");
+
+ return smprintf("%i", v * 100 / 255);
+
+fail:
+ (void)close(fd);
+ return smprintf("FAILED");
}
-char * getvolume(char *mixerpath) {
- return smprintf("N/A");
-}
-
void settz(char *tzname) {
setenv("TZ", tzname, 1);
}
t@@ -211,7 +251,7 @@ void update() {
// battery = smprintf("%i", getsysctl("hw.acpi.battery.life"));
// audio volume
- char *volume = getvolume("/dev/mixer");
+ char *volume = getvolume();
// free disk space (root/home)
char *freehomespace = getfreespace("/home");