Code

screen_outputs: new screen to control MPD's output devices
authorMikael Svantesson <mikael@distopic.net>
Fri, 5 Dec 2008 17:35:56 +0000 (18:35 +0100)
committerMax Kellermann <max@duempel.org>
Fri, 5 Dec 2008 17:35:56 +0000 (18:35 +0100)
The "outputs" screen allows the user to enable or disable MPD's audio
output devices.

13 files changed:
configure.ac
po/POTFILES.in
po/sv.po
src/Makefile.am
src/command.c
src/command.h
src/options.c
src/screen.c
src/screen.h
src/screen_help.c
src/screen_list.c
src/screen_list.h
src/screen_outputs.c [new file with mode: 0644]

index 806006e6b3a94108e7f477724fdf624b7a51496a..e85570bd4bef1c07ef75778245c3620eb239e4bd 100644 (file)
@@ -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],
index c79bfe478b7bec0b35385f9dc87cff121bc98efc..2e32c0ef3c0f82a38af5a5daafa0c7d37731f7fd 100644 (file)
@@ -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
index d5df507d357b314ac397528cd63f6fee18943c11..36062a32155e716a0ea4b8ee02690c7438ed0ec0 100644 (file)
--- 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"
index 4585768de1f099365f13af8321aeb7e872e63f01..ac34b856b3a5fd97192a806bed4955eab6d9bed1 100644 (file)
@@ -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
index e04817fa1e08625579ec3880962210bb3ecb0ac9..1b6519a53d5aeda6727f8911d39ee86310d87b0f 100644 (file)
@@ -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 }
 };
 
index c3b85c97dee97130d22ac1d8326422d677495343..0c928930e84aeb818cc800661dbf633d51dae812 100644 (file)
@@ -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,
index b6a49e3c68204d7cdef42abb9271c5c8d0e73145..3c77fb4d6b3b666d94e75a1e1d6d5ef1e1b23c2b 100644 (file)
@@ -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 */
index 1a68b4100ccbbd3a6604414f2209f872885b01c9..a697fdfd69afd2a80049a107dfc0212b86a06cba 100644 (file)
@@ -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;
index f49ac82d1550173d9b699a9ec874a19859b6a02e..54d37dd5853ffaffe81d707e499c0ce44cbfe6b0 100644 (file)
@@ -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);
index 8804c950bd22735da8b7be9a28af74797c3cb085..cb417d25ca7954d8b309a7c3601b186ebf2d6e43 100644 (file)
@@ -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]))
index bfbf90c639a5b8cd02cdf78b7d33dc5b90fa1e34..09a7a219f92faeb69bb8f9dc723be0a239fb0d0c 100644 (file)
@@ -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]);
index e208a8bfec9d946cdf14f8e807d5599da901ab40..63364c6c6ca880765d508c8ed893ee09fc968da3 100644 (file)
@@ -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 (file)
index 0000000..792e4ef
--- /dev/null
@@ -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,
+};