summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 785cb31)
raw | patch | inline | side by side (parent: 785cb31)
author | Mikael Svantesson <mikael@distopic.net> | |
Fri, 5 Dec 2008 17:35:56 +0000 (18:35 +0100) | ||
committer | Max 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.
output devices.
13 files changed:
configure.ac | patch | blob | history | |
po/POTFILES.in | patch | blob | history | |
po/sv.po | patch | blob | history | |
src/Makefile.am | patch | blob | history | |
src/command.c | patch | blob | history | |
src/command.h | patch | blob | history | |
src/options.c | patch | blob | history | |
src/screen.c | patch | blob | history | |
src/screen.h | patch | blob | history | |
src/screen_help.c | patch | blob | history | |
src/screen_list.c | patch | blob | history | |
src/screen_list.h | patch | blob | history | |
src/screen_outputs.c | [new file with mode: 0644] | patch | blob |
diff --git a/configure.ac b/configure.ac
index 806006e6b3a94108e7f477724fdf624b7a51496a..e85570bd4bef1c07ef75778245c3620eb239e4bd 100644 (file)
--- a/configure.ac
+++ b/configure.ac
[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 c79bfe478b7bec0b35385f9dc87cff121bc98efc..2e32c0ef3c0f82a38af5a5daafa0c7d37731f7fd 100644 (file)
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
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 d5df507d357b314ac397528cd63f6fee18943c11..36062a32155e716a0ea4b8ee02690c7438ed0ec0 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
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..."
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 4585768de1f099365f13af8321aeb7e872e63f01..ac34b856b3a5fd97192a806bed4955eab6d9bed1 100644 (file)
--- a/src/Makefile.am
+++ b/src/Makefile.am
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 e04817fa1e08625579ec3880962210bb3ecb0ac9..1b6519a53d5aeda6727f8911d39ee86310d87b0f 100644 (file)
--- a/src/command.c
+++ b/src/command.c
#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[] = {
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 c3b85c97dee97130d22ac1d8326422d677495343..0c928930e84aeb818cc800661dbf633d51dae812 100644 (file)
--- a/src/command.h
+++ b/src/command.h
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 b6a49e3c68204d7cdef42abb9271c5c8d0e73145..3c77fb4d6b3b666d94e75a1e1d6d5ef1e1b23c2b 100644 (file)
--- a/src/options.c
+++ b/src/options.c
#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 1a68b4100ccbbd3a6604414f2209f872885b01c9..a697fdfd69afd2a80049a107dfc0212b86a06cba 100644 (file)
--- a/src/screen.c
+++ b/src/screen.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
}
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 f49ac82d1550173d9b699a9ec874a19859b6a02e..54d37dd5853ffaffe81d707e499c0ce44cbfe6b0 100644 (file)
--- a/src/screen.h
+++ b/src/screen.h
#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 8804c950bd22735da8b7be9a28af74797c3cb085..cb417d25ca7954d8b309a7c3601b186ebf2d6e43 100644 (file)
--- a/src/screen_help.c
+++ b/src/screen_help.c
{ 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 bfbf90c639a5b8cd02cdf78b7d33dc5b90fa1e34..09a7a219f92faeb69bb8f9dc723be0a239fb0d0c 100644 (file)
--- a/src/screen_list.c
+++ b/src/screen_list.c
#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 e208a8bfec9d946cdf14f8e807d5599da901ab40..63364c6c6ca880765d508c8ed893ee09fc968da3 100644 (file)
--- a/src/screen_list.h
+++ b/src/screen_list.h
#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
--- /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,
+};