diff options
Diffstat (limited to 'src/interface.c')
-rw-r--r-- | src/interface.c | 111 |
1 files changed, 39 insertions, 72 deletions
diff --git a/src/interface.c b/src/interface.c index f904407..fe3dbc3 100644 --- a/src/interface.c +++ b/src/interface.c @@ -111,7 +111,7 @@ interface_resize(gpointer data) } static void -print_volume(struct context *ctx, struct vol_ctl *ctl, int y) +print_volume(struct context *ctx, struct vol_ctl *ctl) { gint x = 2 /* left */ + 2 /* index num width */ + 1 /* space */ + 1 /* space */ + ctx->max_name_len; @@ -120,103 +120,70 @@ print_volume(struct context *ctx, struct vol_ctl *ctl, int y) int volume_bar_len = getmaxx(ctx->menu_win) - x - 7; gint vol = (gint) (volume_bar_len * ctl->vol / PA_VOLUME_NORM); - mvwprintw(ctx->menu_win, y, x - 1, " [%c]", ctl->mute ? 'M' : ' '); + mvwprintw(ctx->menu_win, ctx->y, x - 1, " [%c]", ctl->mute ? 'M' : ' '); x += 4; - mvwprintw(ctx->menu_win, y, x - 1 , "["); + mvwprintw(ctx->menu_win, ctx->y, x - 1 , "["); for (gint i = 0; i < vol; ++i) - mvwprintw(ctx->menu_win, y, x + i, "="); + mvwprintw(ctx->menu_win, ctx->y, x + i, "="); for (gint i = vol; i < volume_bar_len; ++i) - mvwprintw(ctx->menu_win, y, x + i, " "); - mvwprintw(ctx->menu_win, y, x + volume_bar_len, "]"); + mvwprintw(ctx->menu_win, ctx->y, x + i, " "); + mvwprintw(ctx->menu_win, ctx->y, x + volume_bar_len, "]"); } static void -print_input_list(struct context *ctx, struct sink_info *sink, - gint sink_num, gint *poffset) +print_vol_ctl(gpointer data, gpointer user_data) { - struct sink_input_info *input; - gint offset = *poffset; - gboolean selected; - gint i = -1; - - list_foreach(ctx->input_list, input) { - if (input->sink != sink->base.index) - continue; - selected = (ctx->chooser_sink == sink_num && - ctx->chooser_input == ++i); - - if (selected) - wattron(ctx->menu_win, A_REVERSE); - - mvwprintw(ctx->menu_win, offset, 2, "%*s%-*s", - 2+1+input->base.indent, "", /* space for index number */ - ctx->max_name_len - input->base.indent, - input->base.name); - - if (selected) - wattroff(ctx->menu_win, A_REVERSE); + struct vol_ctl *ctl = data; + struct context *ctx = user_data; + gint x = 2; + gboolean selected = (ctl == interface_get_current_ctl(ctx, NULL)); - print_volume(ctx, &input->base, offset); - offset++; + if (selected) + wattron(ctx->menu_win, A_REVERSE); + if (!ctl->hide_index) { + mvwprintw(ctx->menu_win, ctx->y, x, "%2u ", ctl->index); + x += 3; } - *poffset = offset; + mvwprintw(ctx->menu_win, ctx->y, x, "%*s%-*s", + ctl->indent + (ctl->hide_index ? 2+1 : 0), "", + ctx->max_name_len - ctl->indent, ctl->name); + if (selected) + wattroff(ctx->menu_win, A_REVERSE); + print_volume(ctx, ctl); + ctx->y++; + + if (ctl->childs_foreach) + ctl->childs_foreach(ctl, print_vol_ctl, ctx); } -static inline void -max_name_len_helper(GList *list, guint *max_len) +static void +max_name_len_helper(gpointer data, gpointer user_data) { - struct vol_ctl *ctl; + struct vol_ctl *ctl = data; + struct context *ctx = user_data; guint len; - list_foreach(list, ctl) { - len = ctl->indent + strlen(ctl->name); - - if (len > *max_len) - *max_len= len; - } -} + len = ctl->indent + strlen(ctl->name); + if (len > ctx->max_name_len) + ctx->max_name_len = len; -/* looking for the longest name length of all SINK's and INPUT's */ -static void -set_max_name_len(struct context *ctx) -{ - ctx->max_name_len = 0; - max_name_len_helper(ctx->sink_list, &ctx->max_name_len); - max_name_len_helper(ctx->input_list, &ctx->max_name_len); + if (ctl->childs_foreach) + ctl->childs_foreach(ctl, max_name_len_helper, ctx); } void interface_redraw(struct context *ctx) { - struct sink_info *sink; - gint i = -1; - gint x = 2; - gint offset = 2; /* top border + 1 empty line */ - - /* looking for the longest name for right indentation */ - set_max_name_len(ctx); - werase(ctx->menu_win); box(ctx->menu_win, 0, 0); - list_foreach(ctx->sink_list, sink) { - gboolean selected = (++i == ctx->chooser_sink && - ctx->chooser_input == SELECTED_SINK); - - if (selected) - wattron(ctx->menu_win, A_REVERSE); - - mvwprintw(ctx->menu_win, offset, x, "%2u %-*s", - sink->base.index, ctx->max_name_len, sink->base.name); + ctx->y = 2; /* top border + 1 empty line */ + ctx->max_name_len = 0; - if (selected) - wattroff(ctx->menu_win, A_REVERSE); - print_volume(ctx, &sink->base, offset); + g_list_foreach(ctx->sink_list, max_name_len_helper, ctx); + g_list_foreach(ctx->sink_list, print_vol_ctl, ctx); - offset++; - print_input_list(ctx, sink, i, &offset); - } wrefresh(ctx->menu_win); } |