aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am4
-rw-r--r--src/command.c7
-rw-r--r--src/command.h1
-rw-r--r--src/options.c4
-rw-r--r--src/screen.c11
-rw-r--r--src/screen.h4
-rw-r--r--src/screen_help.c7
-rw-r--r--src/screen_list.c3
-rw-r--r--src/screen_list.h4
-rw-r--r--src/screen_outputs.c197
10 files changed, 242 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 4585768de..ac34b856b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -101,6 +101,10 @@ if ENABLE_LYRICS_SCREEN
ncmpc_SOURCES += screen_lyrics.c lyrics.c
endif
+if ENABLE_OUTPUTS_SCREEN
+ncmpc_SOURCES += screen_outputs.c
+endif
+
if ENABLE_LIRC
ncmpc_SOURCES += lirc.c
endif
diff --git a/src/command.c b/src/command.c
index e04817fa1..1b6519a53 100644
--- a/src/command.c
+++ b/src/command.c
@@ -59,6 +59,7 @@
#define F5 KEY_F(5)
#define F6 KEY_F(6)
#define F7 KEY_F(7)
+#define F8 KEY_F(8)
static command_definition_t cmds[] = {
@@ -205,6 +206,12 @@ static command_definition_t cmds[] = {
N_("Update Lyrics") },
#endif
+#ifdef ENABLE_OUTPUTS_SCREEN
+ { {'8', F8, 0 }, 0, CMD_SCREEN_OUTPUTS, "screen-outputs",
+ N_("Outputs screen") },
+#endif
+
+
{ { -1, -1, -1 }, 0, CMD_NONE, NULL, NULL }
};
diff --git a/src/command.h b/src/command.h
index c3b85c97d..0c928930e 100644
--- a/src/command.h
+++ b/src/command.h
@@ -58,6 +58,7 @@ typedef enum {
CMD_SCREEN_KEYDEF,
CMD_SCREEN_HELP,
CMD_SCREEN_LYRICS,
+ CMD_SCREEN_OUTPUTS,
CMD_LYRICS_UPDATE,
CMD_INTERRUPT,
CMD_GO_ROOT_DIRECTORY,
diff --git a/src/options.c b/src/options.c
index b6a49e3c6..3c77fb4d6 100644
--- a/src/options.c
+++ b/src/options.c
@@ -181,6 +181,10 @@ handle_option(int c, const char *arg)
#ifdef ENABLE_KEYDEF_SCREEN
" key-screen"
#endif
+#ifdef ENABLE_OUTPUTS_SCREEN
+ " outputs-screen"
+#endif
+
"\n");
exit(EXIT_SUCCESS);
case 'c': /* --colors */
diff --git a/src/screen.c b/src/screen.c
index 1a68b4100..a697fdfd6 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -159,6 +159,12 @@ paint_top_window2(const char *header, mpdclient_t *c)
#ifdef ENABLE_LYRICS_SCREEN
print_hotkey(w, CMD_SCREEN_LYRICS, _("Lyrics"));
#endif
+#ifdef ENABLE_OUTPUTS_SCREEN
+ colors_use(w, COLOR_TITLE_BOLD);
+ waddstr(w, get_key_names(CMD_SCREEN_OUTPUTS, FALSE));
+ colors_use(w, COLOR_TITLE);
+ waddstr(w, _(":Outputs "));
+#endif
#endif
}
@@ -844,6 +850,11 @@ screen_cmd(mpdclient_t *c, command_t cmd)
screen_switch(&screen_lyrics, c);
break;
#endif
+#ifdef ENABLE_OUTPUTS_SCREEN
+ case CMD_SCREEN_OUTPUTS:
+ screen_switch(&screen_outputs, c);
+ break;
+#endif
default:
break;
}
diff --git a/src/screen.h b/src/screen.h
index f49ac82d1..54d37dd58 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -65,6 +65,10 @@ extern const struct screen_functions screen_keydef;
#ifdef ENABLE_LYRICS_SCREEN
extern const struct screen_functions screen_lyrics;
#endif
+#ifdef ENABLE_OUTPUTS_SCREEN
+extern const struct screen_functions screen_outputs;
+#endif
+
typedef struct screen_functions {
void (*init)(WINDOW *w, int cols, int rows);
diff --git a/src/screen_help.c b/src/screen_help.c
index 8804c950b..cb417d25c 100644
--- a/src/screen_help.c
+++ b/src/screen_help.c
@@ -138,6 +138,13 @@ static help_text_row_t help_text[] = {
{ 0, CMD_LYRICS_UPDATE, N_("Explicitly download lyrics") },
{ 0, CMD_ADD, N_("Save lyrics") },
#endif
+#ifdef ENABLE_OUTPUTS_SCREEN
+ { 0, CMD_NONE, NULL },
+ { 0, CMD_NONE, NULL },
+ { 1, CMD_NONE, N_("Keys - Outputs screen") },
+ { 2, CMD_NONE, NULL },
+ { 0, CMD_PLAY, N_("Enable/disable output") },
+#endif
};
#define help_text_rows (sizeof(help_text) / sizeof(help_text[0]))
diff --git a/src/screen_list.c b/src/screen_list.c
index bfbf90c63..09a7a219f 100644
--- a/src/screen_list.c
+++ b/src/screen_list.c
@@ -47,6 +47,9 @@ static const struct
#ifdef ENABLE_LYRICS_SCREEN
{ "lyrics", &screen_lyrics },
#endif
+#ifdef ENABLE_OUTPUTS_SCREEN
+ { "outputs", &screen_outputs },
+#endif
};
static const unsigned NUM_SCREENS = sizeof(screens) / sizeof(screens[0]);
diff --git a/src/screen_list.h b/src/screen_list.h
index e208a8bfe..63364c6c6 100644
--- a/src/screen_list.h
+++ b/src/screen_list.h
@@ -43,6 +43,10 @@ extern const struct screen_functions screen_keydef;
#ifdef ENABLE_LYRICS_SCREEN
extern const struct screen_functions screen_lyrics;
#endif
+#ifdef ENABLE_OUTPUTS_SCREEN
+extern const struct screen_functions screen_outputs;
+#endif
+
void
screen_list_init(WINDOW *w, unsigned cols, unsigned rows);
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,
+};