volume: fix colors (+param struct)
This commit is contained in:
parent
b20491cb6b
commit
ffedf14066
16
i3status.c
16
i3status.c
|
@ -820,11 +820,17 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
CASE_SEC_TITLE("volume") {
|
CASE_SEC_TITLE("volume") {
|
||||||
SEC_OPEN_MAP("volume");
|
SEC_OPEN_MAP("volume");
|
||||||
print_volume(json_gen, buffer, cfg_getstr(sec, "format"),
|
volume_ctx_t ctx = {
|
||||||
cfg_getstr(sec, "format_muted"),
|
.json_gen = json_gen,
|
||||||
cfg_getstr(sec, "device"),
|
.buf = buffer,
|
||||||
cfg_getstr(sec, "mixer"),
|
.buflen = sizeof(buffer),
|
||||||
cfg_getint(sec, "mixer_idx"));
|
.fmt = cfg_getstr(sec, "format"),
|
||||||
|
.fmt_muted = cfg_getstr(sec, "format_muted"),
|
||||||
|
.device = cfg_getstr(sec, "device"),
|
||||||
|
.mixer = cfg_getstr(sec, "mixer"),
|
||||||
|
.mixer_idx = cfg_getint(sec, "mixer_idx"),
|
||||||
|
};
|
||||||
|
print_volume(&ctx);
|
||||||
SEC_CLOSE_MAP;
|
SEC_CLOSE_MAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -326,7 +326,20 @@ void print_eth_info(eth_info_ctx_t *ctx);
|
||||||
|
|
||||||
void print_load(yajl_gen json_gen, char *buffer, const char *format, const char *format_above_threshold, const float max_threshold);
|
void print_load(yajl_gen json_gen, char *buffer, const char *format, const char *format_above_threshold, const float max_threshold);
|
||||||
void print_memory(yajl_gen json_gen, char *buffer, const char *format, const char *format_degraded, const char *threshold_degraded, const char *threshold_critical, const char *memory_used_method, const char *unit, const int decimals);
|
void print_memory(yajl_gen json_gen, char *buffer, const char *format, const char *format_degraded, const char *threshold_degraded, const char *threshold_critical, const char *memory_used_method, const char *unit, const int decimals);
|
||||||
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);
|
|
||||||
|
typedef struct {
|
||||||
|
yajl_gen json_gen;
|
||||||
|
char *buf;
|
||||||
|
const size_t buflen;
|
||||||
|
const char *fmt;
|
||||||
|
const char *fmt_muted;
|
||||||
|
const char *device;
|
||||||
|
const char *mixer;
|
||||||
|
int mixer_idx;
|
||||||
|
} volume_ctx_t;
|
||||||
|
|
||||||
|
void print_volume(volume_ctx_t *ctx);
|
||||||
|
|
||||||
bool process_runs(const char *path);
|
bool process_runs(const char *path);
|
||||||
int volume_pulseaudio(uint32_t sink_idx, const char *sink_name);
|
int volume_pulseaudio(uint32_t sink_idx, const char *sink_name);
|
||||||
bool description_pulseaudio(uint32_t sink_idx, const char *sink_name, char buffer[MAX_SINK_DESCRIPTION_LEN]);
|
bool description_pulseaudio(uint32_t sink_idx, const char *sink_name, char buffer[MAX_SINK_DESCRIPTION_LEN]);
|
||||||
|
|
|
@ -47,10 +47,10 @@
|
||||||
fprintf(stderr, "i3status: ALSA: " #channel "_switch: %s\n", snd_strerror(err)); \
|
fprintf(stderr, "i3status: ALSA: " #channel "_switch: %s\n", snd_strerror(err)); \
|
||||||
if (!pbval) { \
|
if (!pbval) { \
|
||||||
START_COLOR("color_degraded"); \
|
START_COLOR("color_degraded"); \
|
||||||
fmt = fmt_muted; \
|
ctx->fmt = ctx->fmt_muted; \
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *apply_volume_format(const char *fmt, char *buffer, int ivolume, const char *devicename) {
|
static char *apply_volume_format(const char *fmt, int ivolume, const char *devicename) {
|
||||||
char string_volume[STRING_SIZE];
|
char string_volume[STRING_SIZE];
|
||||||
|
|
||||||
snprintf(string_volume, STRING_SIZE, "%d%s", ivolume, pct_mark);
|
snprintf(string_volume, STRING_SIZE, "%d%s", ivolume, pct_mark);
|
||||||
|
@ -61,19 +61,18 @@ static char *apply_volume_format(const char *fmt, char *buffer, int ivolume, con
|
||||||
{.name = "%devicename", .value = devicename}};
|
{.name = "%devicename", .value = devicename}};
|
||||||
|
|
||||||
const size_t num = sizeof(placeholders) / sizeof(placeholder_t);
|
const size_t num = sizeof(placeholders) / sizeof(placeholder_t);
|
||||||
buffer = format_placeholders(fmt, &placeholders[0], num);
|
return format_placeholders(fmt, &placeholders[0], num);
|
||||||
|
|
||||||
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) {
|
void print_volume(volume_ctx_t *ctx) {
|
||||||
char *outwalk = buffer;
|
char *outwalk = ctx->buf;
|
||||||
int pbval = 1;
|
int pbval = 1;
|
||||||
|
#define json_gen ctx->json_gen
|
||||||
|
|
||||||
/* Printing volume works with ALSA and PulseAudio at the moment */
|
/* Printing volume works with ALSA and PulseAudio at the moment */
|
||||||
if (output_format == O_I3BAR) {
|
if (output_format == O_I3BAR) {
|
||||||
char *instance;
|
char *instance;
|
||||||
asprintf(&instance, "%s.%s.%d", device, mixer, mixer_idx);
|
asprintf(&instance, "%s.%s.%d", ctx->device, ctx->mixer, ctx->mixer_idx);
|
||||||
INSTANCE(instance);
|
INSTANCE(instance);
|
||||||
free(instance);
|
free(instance);
|
||||||
}
|
}
|
||||||
|
@ -84,11 +83,11 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
|
||||||
/* If the device name has the format "pulse[:N]" where N is the
|
/* If the device name has the format "pulse[:N]" where N is the
|
||||||
* index of the PulseAudio sink then force PulseAudio, optionally
|
* index of the PulseAudio sink then force PulseAudio, optionally
|
||||||
* overriding the default sink */
|
* overriding the default sink */
|
||||||
if (!strncasecmp(device, "pulse", strlen("pulse"))) {
|
if (!strncasecmp(ctx->device, "pulse", strlen("pulse"))) {
|
||||||
uint32_t sink_idx = device[strlen("pulse")] == ':' ? (uint32_t)atoi(device + strlen("pulse:")) : DEFAULT_SINK_INDEX;
|
uint32_t sink_idx = ctx->device[strlen("pulse")] == ':' ? (uint32_t)atoi(ctx->device + strlen("pulse:")) : DEFAULT_SINK_INDEX;
|
||||||
const char *sink_name = device[strlen("pulse")] == ':' &&
|
const char *sink_name = ctx->device[strlen("pulse")] == ':' &&
|
||||||
!isdigit(device[strlen("pulse:")])
|
!isdigit(ctx->device[strlen("pulse:")])
|
||||||
? device + strlen("pulse:")
|
? ctx->device + strlen("pulse:")
|
||||||
: NULL;
|
: NULL;
|
||||||
int cvolume = 0;
|
int cvolume = 0;
|
||||||
char description[MAX_SINK_DESCRIPTION_LEN] = {'\0'};
|
char description[MAX_SINK_DESCRIPTION_LEN] = {'\0'};
|
||||||
|
@ -111,12 +110,13 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
|
||||||
/* negative result means error, stick to 0 */
|
/* negative result means error, stick to 0 */
|
||||||
if (ivolume < 0)
|
if (ivolume < 0)
|
||||||
ivolume = 0;
|
ivolume = 0;
|
||||||
buffer = apply_volume_format(muted ? fmt_muted : fmt,
|
char *formatted = apply_volume_format(muted ? ctx->fmt_muted : ctx->fmt,
|
||||||
buffer,
|
ivolume,
|
||||||
ivolume,
|
description);
|
||||||
description);
|
OUTPUT_FORMATTED;
|
||||||
|
free(formatted);
|
||||||
goto out_with_format;
|
goto out_with_format;
|
||||||
} else if (!strcasecmp(device, "default") && pulse_initialize()) {
|
} else if (!strcasecmp(ctx->device, "default") && pulse_initialize()) {
|
||||||
/* no device specified or "default" set */
|
/* no device specified or "default" set */
|
||||||
char description[MAX_SINK_DESCRIPTION_LEN];
|
char description[MAX_SINK_DESCRIPTION_LEN];
|
||||||
bool success = description_pulseaudio(DEFAULT_SINK_INDEX, NULL, description);
|
bool success = description_pulseaudio(DEFAULT_SINK_INDEX, NULL, description);
|
||||||
|
@ -128,10 +128,11 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
|
||||||
START_COLOR("color_degraded");
|
START_COLOR("color_degraded");
|
||||||
pbval = 0;
|
pbval = 0;
|
||||||
}
|
}
|
||||||
buffer = apply_volume_format(muted ? fmt_muted : fmt,
|
char *formatted = apply_volume_format(muted ? ctx->fmt_muted : ctx->fmt,
|
||||||
buffer,
|
ivolume,
|
||||||
ivolume,
|
description);
|
||||||
description);
|
OUTPUT_FORMATTED;
|
||||||
|
free(formatted);
|
||||||
goto out_with_format;
|
goto out_with_format;
|
||||||
}
|
}
|
||||||
/* negative result or NULL description means error, fail PulseAudio attempt */
|
/* negative result or NULL description means error, fail PulseAudio attempt */
|
||||||
|
@ -157,7 +158,7 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Attach this mixer handle to the given device */
|
/* Attach this mixer handle to the given device */
|
||||||
if ((err = snd_mixer_attach(m, device)) < 0) {
|
if ((err = snd_mixer_attach(m, ctx->device)) < 0) {
|
||||||
fprintf(stderr, "i3status: ALSA: Cannot attach mixer to device: %s\n", snd_strerror(err));
|
fprintf(stderr, "i3status: ALSA: Cannot attach mixer to device: %s\n", snd_strerror(err));
|
||||||
snd_mixer_close(m);
|
snd_mixer_close(m);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -183,8 +184,8 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the given mixer */
|
/* Find the given mixer */
|
||||||
snd_mixer_selem_id_set_index(sid, mixer_idx);
|
snd_mixer_selem_id_set_index(sid, ctx->mixer_idx);
|
||||||
snd_mixer_selem_id_set_name(sid, mixer);
|
snd_mixer_selem_id_set_name(sid, ctx->mixer);
|
||||||
if (!(elem = snd_mixer_find_selem(m, sid))) {
|
if (!(elem = snd_mixer_find_selem(m, sid))) {
|
||||||
fprintf(stderr, "i3status: ALSA: Cannot find mixer %s (index %u)\n",
|
fprintf(stderr, "i3status: ALSA: Cannot find mixer %s (index %u)\n",
|
||||||
snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));
|
snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));
|
||||||
|
@ -195,7 +196,7 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
|
||||||
|
|
||||||
/* Get the volume range to convert the volume later */
|
/* Get the volume range to convert the volume later */
|
||||||
snd_mixer_handle_events(m);
|
snd_mixer_handle_events(m);
|
||||||
if (!strncasecmp(mixer, "capture", strlen("capture"))) {
|
if (!strncasecmp(ctx->mixer, "capture", strlen("capture"))) {
|
||||||
ALSA_VOLUME(capture)
|
ALSA_VOLUME(capture)
|
||||||
} else {
|
} else {
|
||||||
ALSA_VOLUME(playback)
|
ALSA_VOLUME(playback)
|
||||||
|
@ -234,7 +235,9 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
|
||||||
ALSA_MUTE_SWITCH(capture)
|
ALSA_MUTE_SWITCH(capture)
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer = apply_volume_format(fmt, buffer, avg, mixer_name);
|
char *formatted = apply_volume_format(ctx->fmt, avg, mixer_name);
|
||||||
|
OUTPUT_FORMATTED;
|
||||||
|
free(formatted);
|
||||||
|
|
||||||
snd_mixer_close(m);
|
snd_mixer_close(m);
|
||||||
snd_mixer_selem_id_free(sid);
|
snd_mixer_selem_id_free(sid);
|
||||||
|
@ -357,12 +360,11 @@ void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *
|
||||||
out:
|
out:
|
||||||
if (!pbval)
|
if (!pbval)
|
||||||
END_COLOR;
|
END_COLOR;
|
||||||
OUTPUT_FULL_TEXT(buffer);
|
OUTPUT_FULL_TEXT(ctx->buf);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
out_with_format:
|
out_with_format:
|
||||||
if (!pbval)
|
if (!pbval)
|
||||||
END_COLOR;
|
END_COLOR;
|
||||||
OUTPUT_FULL_TEXT(buffer);
|
OUTPUT_FULL_TEXT(ctx->buf);
|
||||||
free(buffer);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user