use format_placeholder for volume

This commit is contained in:
Felix Buehler 2020-04-07 23:02:30 +02:00
parent e697a1f19f
commit 44fad4d2cd

View File

@ -31,6 +31,8 @@
#include "i3status.h"
#include "queue.h"
#define STRING_SIZE 10
#define ALSA_VOLUME(channel) \
err = snd_mixer_selem_get_##channel##_dB_range(elem, &min, &max) || \
snd_mixer_selem_get_##channel##_dB(elem, 0, &val); \
@ -48,30 +50,20 @@
fmt = fmt_muted; \
}
static char *apply_volume_format(const char *fmt, char *outwalk, int ivolume, const char *devicename) {
const char *walk = fmt;
static char *apply_volume_format(const char *fmt, char *buffer, int ivolume, const char *devicename) {
char string_volume[STRING_SIZE];
for (; *walk != '\0'; walk++) {
if (*walk != '%') {
*(outwalk++) = *walk;
snprintf(string_volume, STRING_SIZE, "%d%s", ivolume, pct_mark);
} else if (BEGINS_WITH(walk + 1, "%")) {
outwalk += sprintf(outwalk, "%s", pct_mark);
walk += strlen("%");
placeholder_t placeholders[] = {
{.name = "%%", .value = pct_mark},
{.name = "%volume", .value = string_volume},
{.name = "%devicename", .value = devicename}};
} else if (BEGINS_WITH(walk + 1, "volume")) {
outwalk += sprintf(outwalk, "%d%s", ivolume, pct_mark);
walk += strlen("volume");
const size_t num = sizeof(placeholders) / sizeof(placeholder_t);
buffer = format_placeholders(fmt, &placeholders[0], num);
} else if (BEGINS_WITH(walk + 1, "devicename")) {
outwalk += sprintf(outwalk, "%s", devicename);
walk += strlen("devicename");
} else {
*(outwalk++) = '%';
}
}
return outwalk;
return buffer;
}
void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *fmt_muted, const char *device, const char *mixer, int mixer_idx) {
@ -119,8 +111,8 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
/* negative result means error, stick to 0 */
if (ivolume < 0)
ivolume = 0;
outwalk = apply_volume_format(muted ? fmt_muted : fmt,
outwalk,
buffer = apply_volume_format(muted ? fmt_muted : fmt,
buffer,
ivolume,
description);
goto out;
@ -136,8 +128,8 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
START_COLOR("color_degraded");
pbval = 0;
}
outwalk = apply_volume_format(muted ? fmt_muted : fmt,
outwalk,
buffer = apply_volume_format(muted ? fmt_muted : fmt,
buffer,
ivolume,
description);
goto out;
@ -356,12 +348,11 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
}
#endif
outwalk = apply_volume_format(fmt, outwalk, vol & 0x7f, devicename);
buffer = apply_volume_format(fmt, buffer, vol & 0x7f, devicename);
close(mixfd);
#endif
out:
*outwalk = '\0';
if (!pbval)
END_COLOR;
OUTPUT_FULL_TEXT(buffer);