diff options
author | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-12-18 16:05:38 +0100 |
---|---|---|
committer | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-12-18 16:05:38 +0100 |
commit | 27675c45d74167b08446e4d36425a1738c8e1609 (patch) | |
tree | ca7aede29cef46852951e4fe85bbebbcc20b122b /src/interface.c | |
parent | 2d4dcc93891570391a993fa151f0ef02997e2307 (diff) | |
download | pa-sink-ctl-27675c45d74167b08446e4d36425a1738c8e1609.tar.gz pa-sink-ctl-27675c45d74167b08446e4d36425a1738c8e1609.tar.bz2 pa-sink-ctl-27675c45d74167b08446e4d36425a1738c8e1609.zip |
interface: Unify drawing code for sinks and inputs
They are drawn from the same function that calls itself
recursiveley for childs of the currently drawn volume control.
So its called for all sink_inputs that belong to a sink.
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); } |