diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/command.c | 7 | ||||
-rw-r--r-- | src/command.h | 1 | ||||
-rw-r--r-- | src/options.c | 4 | ||||
-rw-r--r-- | src/screen.c | 11 | ||||
-rw-r--r-- | src/screen.h | 4 | ||||
-rw-r--r-- | src/screen_help.c | 7 | ||||
-rw-r--r-- | src/screen_list.c | 3 | ||||
-rw-r--r-- | src/screen_list.h | 4 | ||||
-rw-r--r-- | src/screen_outputs.c | 197 |
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, +}; |