aboutsummaryrefslogblamecommitdiffstats
path: root/src/screen_outputs.c
blob: a22fc925a0448285e0154318ae686100eef545d3 (plain) (tree)
1
2
3
4
5
6
7
8
9



                                                



                                                                       
 



                                                                  




                                                                          



















































































































































































                                                                              
/* ncmpc (Ncurses MPD Client)
 * (c) 2004-2009 The Music Player Daemon Project
 * Project homepage: http://musicpd.org
 
 * 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.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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,
};