From 67c47a5e468f15b9a0e4cc1187f2122d10e2b2f9 Mon Sep 17 00:00:00 2001 From: c0dev0id Date: Mon, 5 Dec 2022 22:40:28 +0100 Subject: [PATCH] Update 2022-12-05 22:40 OpenBSD/amd64 --- .config/spectrwm/cbar.c | 76 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 6 deletions(-) diff --git a/.config/spectrwm/cbar.c b/.config/spectrwm/cbar.c index 7de972b..cf830dc 100644 --- a/.config/spectrwm/cbar.c +++ b/.config/spectrwm/cbar.c @@ -2,6 +2,7 @@ #include #include #include +#include #include @@ -10,6 +11,12 @@ #include #include +#include +#include +#include +#include +#include + #include @@ -18,24 +25,73 @@ static int cpu_temp = 46; static int fan_speed = 3392; static int cpu_base_speed = 2501; static int cpu_avg_speed = 468; +static int volume = 50; + + +void update_volume() { + static int cls = -1, fd, v; + static struct mixer_devinfo mdi; + static struct mixer_ctrl mc; + + if ((fd = open("/dev/mixer", O_RDONLY)) == -1) { + volume = -1; + } + + 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) { + volume = -1; + return; + } + + volume = v * 100 / 255; + +fail: + (void)close(fd); + volume = -1; + return; +} void update_fan_speed() { struct sensor sensor; size_t slen = sizeof(sensor); // XXX hw.sensors.acpithinkpad0.fan0 int mib[5] = { CTL_HW, HW_SENSORS, 5, SENSOR_FANRPM, 0 }; // Lenovo x230 - if (sysctl(mib, 5, &sensor, &slen, NULL, 0) != -1) + if (sysctl(mib, 5, &sensor, &slen, NULL, 0) != -1) { fan_speed = sensor.value; + return; + } fan_speed = -1; } void update_cpu_temp() { struct sensor sensor; size_t slen = sizeof(sensor); - // XXX hw.sensors.cpu0.temp0 - int mib[5] = { CTL_HW, HW_SENSORS, 0, SENSOR_TEMP, 0 }; // Lenovo x230 - if (sysctl(mib, 5, &sensor, &slen, NULL, 0) != -1) + int mib[5] = { CTL_HW, HW_SENSORS, 0, SENSOR_TEMP, 0 }; + if (sysctl(mib, 5, &sensor, &slen, NULL, 0) != -1) { cpu_temp = (sensor.value - 273150000) / 1000000.0; + return; + } cpu_temp = -1; } @@ -45,12 +101,16 @@ void update_battery() { if ((fd = open("/dev/apm", O_RDONLY)) == -1 || ioctl(fd, APM_IOC_GETPOWER, &pi) == -1 || - close(fd) == -1) + close(fd) == -1) { battery_percent = -1; + return; + } if (pi.battery_state == APM_BATT_UNKNOWN || - pi.battery_state == APM_BATTERY_ABSENT) + pi.battery_state == APM_BATTERY_ABSENT) { battery_percent = -1; + return; + } battery_percent = pi.battery_life; } @@ -59,9 +119,13 @@ int main(int argc, const char *argv[]) { while(1) { + + // XXX can update at different intervals update_battery(); update_cpu_temp(); update_fan_speed(); + update_volume(); + wprintf(L"%s %d%% %s %dC %s %4dRPM %s %4dMhz (~%4dMhz) %s\n", "", battery_percent, " ", cpu_temp,