diff options
Diffstat (limited to 'src/screen_outputs.c')
-rw-r--r-- | src/screen_outputs.c | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/screen_outputs.c b/src/screen_outputs.c new file mode 100644 index 000000000..792e4ef2a --- /dev/null +++ b/src/screen_outputs.c @@ -0,0 +1,197 @@ +/* + * (c) 2008 by Mikael Svantesson <mikael@distopic.net> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "i18n.h" +#include "screen.h" +#include "list_window.h" + +#include <glib.h> + +static list_window_t *lw = NULL; + +static GPtrArray *mpd_outputs = NULL; + +static void +outputs_paint(void); + +static void +outputs_repaint(void) +{ + outputs_paint(); + wrefresh(lw->w); +} + +static int +toggle_output(mpdclient_t *c, unsigned int output_index) +{ + int return_value; + mpd_OutputEntity *output; + + assert(mpd_outputs != NULL); + + if (output_index >= mpd_outputs->len) + return -1; + + output = g_ptr_array_index(mpd_outputs, output_index); + + if (output->enabled == 0) { + mpd_sendEnableOutputCommand(c->connection, output->id); + + output->enabled = 1; + + screen_status_printf(_("Output '%s' enabled"), output->name); + } else { + mpd_sendDisableOutputCommand(c->connection, output->id); + + output->enabled = 0; + + screen_status_printf(_("Output '%s' disabled"), output->name); + } + + return_value = mpdclient_finish_command(c); + + outputs_repaint(); + + return return_value; +} + +static void +clear_output_element(gpointer data, G_GNUC_UNUSED gpointer user_data) +{ + mpd_freeOutputElement(data); +} + +static void +clear_outputs_list(void) +{ + assert(mpd_outputs != NULL); + + if (mpd_outputs->len <= 0) + return; + + g_ptr_array_foreach(mpd_outputs, clear_output_element, NULL); + g_ptr_array_remove_range(mpd_outputs, 0, mpd_outputs->len); +} + +static void +fill_outputs_list(mpdclient_t *c) +{ + mpd_OutputEntity *output; + + assert(mpd_outputs != NULL); + + mpd_sendOutputsCommand(c->connection); + while ((output = mpd_getNextOutput(c->connection)) != NULL) { + g_ptr_array_add(mpd_outputs, output); + } +} + +static const char * +outputs_list_callback(unsigned int output_index, bool *highlight, + G_GNUC_UNUSED void *data) +{ + mpd_OutputEntity *output; + + assert(mpd_outputs != NULL); + + if (output_index >= mpd_outputs->len) + return NULL; + + output = g_ptr_array_index(mpd_outputs, output_index); + + if (output->enabled) + *highlight = true; + + return output->name; +} + +static void +outputs_init(WINDOW *w, int cols, int rows) +{ + lw = list_window_init(w, cols, rows); + + mpd_outputs = g_ptr_array_new(); +} + +static void +outputs_resize(int cols, int rows) +{ + lw->cols = cols; + lw->rows = rows; +} + +static void +outputs_exit(void) +{ + list_window_free(lw); + + g_ptr_array_free(mpd_outputs, TRUE); +} + +static void +outputs_open(mpdclient_t *c) +{ + fill_outputs_list(c); +} + +static void +outputs_close(void) +{ + clear_outputs_list(); +} + +static const char * +outputs_title(G_GNUC_UNUSED char *str, G_GNUC_UNUSED size_t size) +{ + return _("Outputs"); +} + +static void +outputs_paint(void) +{ + list_window_paint(lw, outputs_list_callback, NULL); +} + +static bool +outputs_cmd(mpdclient_t *c, command_t cmd) +{ + assert(mpd_outputs != NULL); + + if (list_window_cmd(lw, mpd_outputs->len, cmd)) { + outputs_repaint(); + return true; + } + + if (cmd == CMD_PLAY) { + toggle_output(c, lw->selected); + return true; + } + + return false; +} + +const struct screen_functions screen_outputs = { + .init = outputs_init, + .exit = outputs_exit, + .open = outputs_open, + .close = outputs_close, + .resize = outputs_resize, + .paint = outputs_paint, + .cmd = outputs_cmd, + .get_title = outputs_title, +}; |