From 3cff7b547795bdeeea44dc54bc851e70bfc7b40f Mon Sep 17 00:00:00 2001 From: Mikael Svantesson Date: Fri, 5 Dec 2008 18:35:56 +0100 Subject: [PATCH] screen_outputs: new screen to control MPD's output devices The "outputs" screen allows the user to enable or disable MPD's audio output devices. --- configure.ac | 13 +++ po/POTFILES.in | 1 + po/sv.po | 26 ++++++ src/Makefile.am | 4 + src/command.c | 7 ++ src/command.h | 1 + src/options.c | 4 + src/screen.c | 11 +++ src/screen.h | 4 + src/screen_help.c | 7 ++ src/screen_list.c | 3 + src/screen_list.h | 4 + src/screen_outputs.c | 197 +++++++++++++++++++++++++++++++++++++++++++ 13 files changed, 282 insertions(+) create mode 100644 src/screen_outputs.c diff --git a/configure.ac b/configure.ac index 806006e..e85570b 100644 --- a/configure.ac +++ b/configure.ac @@ -372,6 +372,19 @@ AC_DEFINE_UNQUOTED([LYRICS_PLUGIN_DIR], ["$lyrics_plugin_dir"], [Directory to search for lyrics plugins]) AC_SUBST(lyrics_plugin_dir) +dnl Optional screen - outputs +AC_MSG_CHECKING([whether to include the outputs screen]) +AC_ARG_ENABLE([outputs-screen], + AC_HELP_STRING([--enable-outputs-screen], + [Enable outputs screen @<:@default=no@:>@]), + [outputs_screen=$enableval], + [outputs_screen=$disable_mini]) +if test "x$outputs_screen" = "xyes" ; then + AC_DEFINE(ENABLE_OUTPUTS_SCREEN, 1, [Enable outputs screen]) +fi + +AM_CONDITIONAL(ENABLE_OUTPUTS_SCREEN, test x$outputs_screen = xyes) + dnl Default host AC_MSG_CHECKING([for default MPD host]) AC_ARG_WITH([default-host], diff --git a/po/POTFILES.in b/po/POTFILES.in index c79bfe4..2e32c0e 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -14,6 +14,7 @@ src/screen_search.c src/screen_keydef.c src/screen_help.c src/screen_lyrics.c +src/screen_outputs.c src/screen_song.c src/command.c src/colors.c diff --git a/po/sv.po b/po/sv.po index d5df507..36062a3 100644 --- a/po/sv.po +++ b/po/sv.po @@ -503,6 +503,16 @@ msgstr "" msgid "No lyrics" msgstr "" +#: src/screen_help.c:140 +#, fuzzy +msgid "Keys - Outputs screen" +msgstr "Tangenter - Utgångar" + +#: src/screen_help.c:142 +#, fuzzy +msgid "Enable/disable output" +msgstr "Öppna/stäng utgångar" + #: src/screen_lyrics.c:290 #, fuzzy msgid "loading..." @@ -548,6 +558,22 @@ msgstr "" msgid "Comment" msgstr "Centrera" +#: src/screen_outputs.c:68 +#, fuzzy +msgid "Output '%s' enabled" +msgstr "Utgång '%s' öppnad" + +#: src/screen_outputs.c:74 +#, fuzzy +msgid "Output '%s' disabled" +msgstr "Utgång '%s' stängd" + +#: src/screen_outputs.c:148 +#, fuzzy +msgid "Outputs" +msgstr "Utgångar" + + #: src/command.c:67 msgid "Key configuration screen" msgstr "Tangentdefinitioner" diff --git a/src/Makefile.am b/src/Makefile.am index 4585768..ac34b85 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 e04817f..1b6519a 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 c3b85c9..0c92893 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 b6a49e3..3c77fb4 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 1a68b41..a697fdf 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 } @@ -843,6 +849,11 @@ screen_cmd(mpdclient_t *c, command_t cmd) case CMD_SCREEN_LYRICS: 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 f49ac82..54d37dd 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 8804c95..cb417d2 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 bfbf90c..09a7a21 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 e208a8b..63364c6 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 0000000..792e4ef --- /dev/null +++ b/src/screen_outputs.c @@ -0,0 +1,197 @@ +/* + * (c) 2008 by Mikael Svantesson + * + * 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 + +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, +}; -- 2.30.2