aboutsummaryrefslogtreecommitdiffstats
path: root/src/screen_outputs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen_outputs.c')
-rw-r--r--src/screen_outputs.c197
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,
+};