[Xfce4-commits] <xfce4-mpc-plugin:master> Add checkitems in rightclick menu to enable/disable mpd outputs
Landry Breuil
noreply at xfce.org
Thu May 13 23:08:03 CEST 2010
Updating branch refs/heads/master
to 8f2a1057581138457e7a1d29ab279d7002c87b57 (commit)
from d652109b6c91a31285e9fc479f1c7a7ca3106b03 (commit)
commit 8f2a1057581138457e7a1d29ab279d7002c87b57
Author: Landry Breuil <landry at xfce.org>
Date: Thu May 13 23:01:45 2010 +0200
Add checkitems in rightclick menu to enable/disable mpd outputs
- add mpc_output_toggled() callback for checkitems to change output device status on mpd server
- add mpc_update_outputs() called when mouse hovers the plugin :
traverse the list of known output, update their status
if not found, create a new checkitem and add it to rightclick menu
- add corresponding t_mpd_output struct in headers
currently, this requires mpd_server_set_output_device(),
mpd_server_get_output_devices() and mpd_data_get_next(),
so this will only work when built against libmpd.
Equivalent code to come in simple-libmpd.{c,h}...
panel-plugin/xfce4-mpc-plugin.c | 54 +++++++++++++++++++++++++++++++++++++++
panel-plugin/xfce4-mpc-plugin.h | 9 ++++++
2 files changed, 63 insertions(+), 0 deletions(-)
diff --git a/panel-plugin/xfce4-mpc-plugin.c b/panel-plugin/xfce4-mpc-plugin.c
index b073146..37f6f48 100644
--- a/panel-plugin/xfce4-mpc-plugin.c
+++ b/panel-plugin/xfce4-mpc-plugin.c
@@ -347,6 +347,57 @@ mpc_repeat_toggled(GtkWidget *widget, t_mpc* mpc)
mpd_player_set_repeat(mpc->mo, gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)));
}
+static void
+mpc_output_toggled(GtkWidget *widget, t_mpc* mpc)
+{
+ DBG("!");
+ int i;
+ /* lookup menuitem */
+ for (i = 0; i < mpc->nb_outputs && mpc->mpd_outputs[i]->menuitem != widget; i++);
+ if (i != mpc->nb_outputs) /* oops case ? */
+ /* set corresponding mpd output status */
+ mpd_server_set_output_device(mpc->mo, mpc->mpd_outputs[i]->id, gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)));
+}
+
+/* get output list from mpd, add a checkbox to rightclick menu for each */
+static void
+mpc_update_outputs(t_mpc* mpc)
+{
+ DBG("!");
+ int i,j=0;
+ MpdData * data = mpd_server_get_output_devices(mpc->mo);
+ do {
+ DBG("got output %d with name %s, enabled=%d",data->output_dev->id,data->output_dev->name,data->output_dev->enabled);
+ /* check if this output doesn't already exist */
+ for (i = 0; i < mpc->nb_outputs && mpc->mpd_outputs[i]->id != data->output_dev->id ; i++);
+
+ if (i == mpc->nb_outputs) {
+ DBG("output not found, adding a new checkitem at pos %d",i);
+ GtkWidget* chkitem = gtk_check_menu_item_new_with_label (data->output_dev->name);
+ g_signal_connect (G_OBJECT(chkitem), "toggled", G_CALLBACK (mpc_output_toggled), mpc);
+ xfce_panel_plugin_menu_insert_item(mpc->plugin,GTK_MENU_ITEM(chkitem));
+ gtk_widget_show (chkitem);
+ mpc->mpd_outputs[i] = g_new(t_mpd_output,1);
+ mpc->mpd_outputs[i]->id = data->output_dev->id;
+ mpc->mpd_outputs[i]->menuitem = chkitem;
+ mpc->nb_outputs++;
+ }
+ mpc->mpd_outputs[i]->enabled = data->output_dev->enabled;
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mpc->mpd_outputs[i]->menuitem), mpc->mpd_outputs[i]->enabled);
+ j++;
+ } while (NULL != (data = mpd_data_get_next (data)));
+ /* something changed, better prune the list and recreate it */
+ /* TODO: test this codepath */
+ if (j != mpc->nb_outputs) {
+ DBG("didnt found same amount of outputs (was %d got %d), resetting output list", mpc->nb_outputs, j);
+ for (i = 0; i < mpc->nb_outputs ; i++) {
+ gtk_widget_destroy(mpc->mpd_outputs[i]->menuitem);
+ g_free(mpc->mpd_outputs[i]);
+ }
+ mpc->nb_outputs = 0;
+ mpc_update_outputs(mpc);
+ }
+}
void
str_replace(GString *str, gchar* pattern, gchar* replacement)
@@ -418,6 +469,7 @@ enter_cb(GtkWidget *widget, GdkEventCrossing* event, t_mpc* mpc)
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mpc->random), mpd_player_get_random(mpc->mo));
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mpc->repeat), mpd_player_get_repeat(mpc->mo));
+ mpc_update_outputs(mpc);
gtk_widget_set_tooltip_text (widget, str->str);
g_string_free(str, TRUE);
@@ -736,6 +788,8 @@ mpc_construct (XfcePanelPlugin * plugin)
mpc->playlist_format = g_strdup("%artist% - %album% -/- (#%track%) %title%");
mpc->show_frame = TRUE;
mpc->playlist = NULL;
+ mpc->mpd_outputs = g_new(t_mpd_output*,1);
+ mpc->nb_outputs = 0;
mpc_read_config (plugin, mpc);
diff --git a/panel-plugin/xfce4-mpc-plugin.h b/panel-plugin/xfce4-mpc-plugin.h
index 8f8e6e8..c128078 100644
--- a/panel-plugin/xfce4-mpc-plugin.h
+++ b/panel-plugin/xfce4-mpc-plugin.h
@@ -32,6 +32,13 @@
#endif /* !HAVE_LIBMPD */
typedef struct {
+ GtkWidget* menuitem;
+ gchar* name;
+ gint id;
+ gint enabled;
+} t_mpd_output;
+
+typedef struct {
XfcePanelPlugin *plugin;
GtkWidget *frame,*ebox,*box,*prev,*stop,*toggle,*next,*random,*repeat,*appl,*about;
GtkWidget *playlist;
@@ -46,6 +53,8 @@ typedef struct {
gchar * playlist_format;
gboolean mpd_repeat;
gboolean mpd_random;
+ gint nb_outputs;
+ t_mpd_output ** mpd_outputs;
} t_mpc;
typedef struct {
More information about the Xfce4-commits
mailing list