[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