[Goodies-commits] r4638 - xfmpc/trunk/src

Mike Massonnet mmassonnet at xfce.org
Sun Apr 20 21:39:57 CEST 2008


Author: mmassonnet
Date: 2008-04-20 19:39:57 +0000 (Sun, 20 Apr 2008)
New Revision: 4638

Modified:
   xfmpc/trunk/src/extended-interface.c
   xfmpc/trunk/src/extended-interface.h
   xfmpc/trunk/src/mpdclient.c
   xfmpc/trunk/src/mpdclient.h
Log:
Make Random and Repeat check menu items work
* src/mpdclient.c,
  src/mpdclient.h:
  - Add new signals "repeat" and "random" on changes
* src/extended-interface.c,
  src/extended-interface.h:
  - Add two callbacks on check menu items "activate"


Modified: xfmpc/trunk/src/extended-interface.c
===================================================================
--- xfmpc/trunk/src/extended-interface.c	2008-04-20 16:45:17 UTC (rev 4637)
+++ xfmpc/trunk/src/extended-interface.c	2008-04-20 19:39:57 UTC (rev 4638)
@@ -50,13 +50,17 @@
 static void             xfmpc_extended_interface_dispose    (GObject *object);
 static void             xfmpc_extended_interface_finalize   (GObject *object);
 
-static void             cb_combobox_changed                 (GtkComboBox *widget,
+static void             cb_interface_changed                (GtkComboBox *widget,
                                                              XfmpcExtendedInterface *extended_interface);
+static void             cb_repeat_switch                    (XfmpcExtendedInterface *extended_interface);
+static void             cb_random_switch                    (XfmpcExtendedInterface *extended_interface);
 static void             cb_context_menu                     (GtkToggleButton *button,
                                                              XfmpcExtendedInterface *extended_interface);
 static void             cb_context_menu_detach              (GtkWidget *button,
                                                              GtkMenu *menu);
-static void             position_menu                       (GtkMenu *menu,
+static void             cb_context_menu_deactivate          (GtkMenuShell *menu,
+                                                             GtkWidget *attach_widget);
+static void             position_context_menu               (GtkMenu *menu,
                                                              gint *x,
                                                              gint *y,
                                                              gboolean *push_in,
@@ -81,6 +85,10 @@
   GtkListStore                     *list_store;
   GtkWidget                        *combobox;
   GtkWidget                        *notebook;
+  GtkWidget                        *repeat;
+  GtkWidget                        *random;
+  GtkWidget                        *context_button;
+  GtkWidget                        *context_menu;
 };
 
 
@@ -163,14 +171,14 @@
   gtk_button_set_image (GTK_BUTTON (widget), image);
 
   /* Context menu */
-  widget = gtk_toggle_button_new ();
-  gtk_widget_set_tooltip_text (widget, _("Context Menu"));
-  gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
-  g_signal_connect (widget, "toggled",
+  priv->context_button = gtk_toggle_button_new ();
+  gtk_widget_set_tooltip_text (priv->context_button, _("Context Menu"));
+  gtk_box_pack_start (GTK_BOX (hbox), priv->context_button, FALSE, FALSE, 0);
+  g_signal_connect (priv->context_button, "toggled",
                     G_CALLBACK (cb_context_menu), extended_interface);
 
   image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
-  gtk_button_set_image (GTK_BUTTON (widget), image);
+  gtk_button_set_image (GTK_BUTTON (priv->context_button), image);
 
   /* Combo box */
   priv->list_store = gtk_list_store_new (N_COLUMNS,
@@ -180,7 +188,7 @@
   priv->combobox = gtk_combo_box_new_with_model (GTK_TREE_MODEL (priv->list_store));
   gtk_box_pack_start (GTK_BOX (hbox), priv->combobox, TRUE, TRUE, 0);
   g_signal_connect (priv->combobox, "changed",
-                    G_CALLBACK (cb_combobox_changed), extended_interface);
+                    G_CALLBACK (cb_interface_changed), extended_interface);
 
   GtkCellRenderer *cell = gtk_cell_renderer_text_new ();
   gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (priv->combobox), cell, TRUE);
@@ -205,6 +213,20 @@
 static void
 xfmpc_extended_interface_dispose (GObject *object)
 {
+  XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE_GET_PRIVATE (object);
+
+  if (GTK_IS_WIDGET (priv->repeat))
+    {
+      gtk_widget_destroy (priv->repeat);
+      priv->repeat = NULL;
+    }
+
+  if (GTK_IS_WIDGET (priv->random))
+    {
+      gtk_widget_destroy (priv->random);
+      priv->random = NULL;
+    }
+
   (*G_OBJECT_CLASS (parent_class)->dispose) (object);
 }
 
@@ -212,7 +234,9 @@
 xfmpc_extended_interface_finalize (GObject *object)
 {
   XfmpcExtendedInterface *extended_interface = XFMPC_EXTENDED_INTERFACE (object);
+  XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE_GET_PRIVATE (extended_interface);
   g_object_unref (G_OBJECT (extended_interface->mpdclient));
+  gtk_widget_destroy (priv->context_menu);
   (*G_OBJECT_CLASS (parent_class)->finalize) (object);
 }
 
@@ -246,9 +270,40 @@
   gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (priv->notebook), child, TRUE, TRUE, GTK_PACK_START);
 }
 
+void
+xfmpc_extended_interface_context_menu_new (XfmpcExtendedInterface *extended_interface,
+                                           GtkWidget *attach_widget)
+{
+  XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE_GET_PRIVATE (extended_interface);
+
+  GtkWidget *menu = priv->context_menu = gtk_menu_new ();
+  gtk_menu_set_screen (GTK_MENU (menu), gtk_widget_get_screen (GTK_WIDGET (attach_widget)));
+  gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (attach_widget), NULL);
+  g_signal_connect (menu, "deactivate",
+                    G_CALLBACK (cb_context_menu_deactivate), attach_widget);
+
+  priv->repeat = gtk_check_menu_item_new_with_label (_("Repeat"));
+  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (priv->repeat),
+                                  xfmpc_mpdclient_get_repeat (extended_interface->mpdclient));
+  g_signal_connect_swapped (priv->repeat, "activate",
+                            G_CALLBACK (cb_repeat_switch), extended_interface);
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->repeat);
+
+  priv->random = gtk_check_menu_item_new_with_label (_("Random"));
+  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (priv->random),
+                                  xfmpc_mpdclient_get_random (extended_interface->mpdclient));
+  g_signal_connect_swapped (priv->random, "activate",
+                            G_CALLBACK (cb_random_switch), extended_interface);
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->random);
+
+  gtk_widget_show_all (menu);
+}
+
+
+
 static void
-cb_combobox_changed (GtkComboBox *widget,
-                     XfmpcExtendedInterface *extended_interface)
+cb_interface_changed (GtkComboBox *widget,
+                      XfmpcExtendedInterface *extended_interface)
 {
   XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE_GET_PRIVATE (extended_interface);
 
@@ -269,55 +324,54 @@
 }
 
 static void
+cb_repeat_switch (XfmpcExtendedInterface *extended_interface)
+{
+  xfmpc_mpdclient_set_repeat (extended_interface->mpdclient,
+                              !xfmpc_mpdclient_get_repeat (extended_interface->mpdclient));
+}
+
+static void
+cb_random_switch (XfmpcExtendedInterface *extended_interface)
+{
+  xfmpc_mpdclient_set_random (extended_interface->mpdclient,
+                              !xfmpc_mpdclient_get_random (extended_interface->mpdclient));
+}
+
+static void
 cb_context_menu (GtkToggleButton *button,
                  XfmpcExtendedInterface *extended_interface)
 {
+  XfmpcExtendedInterfacePrivate *priv = XFMPC_EXTENDED_INTERFACE_GET_PRIVATE (extended_interface);
+
   if (!gtk_toggle_button_get_active (button))
     return;
 
-#if 0
-  GtkWidget *menu = xfmpc_extended_interface_menu_preferences_new (extended_interface);
-#else
-  GtkWidget *menu = gtk_menu_new ();
-  gtk_menu_set_screen (GTK_MENU (menu), gtk_widget_get_screen (GTK_WIDGET (button)));
-  gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (button),
-                             (GtkMenuDetachFunc) cb_context_menu_detach);
-  g_signal_connect (menu, "deactivate",
-                    G_CALLBACK (gtk_menu_detach), NULL);
+  if (GTK_IS_MENU (priv->context_menu))
+    gtk_widget_destroy (priv->context_menu);
+  xfmpc_extended_interface_context_menu_new (extended_interface, priv->context_button);
 
-
-  GtkWidget *item = gtk_check_menu_item_new_with_label (_("Repeat"));
-  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-
-  item = gtk_check_menu_item_new_with_label (_("Random"));
-  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-
-  gtk_widget_show_all (menu);
-#endif
-
-  gtk_menu_popup (GTK_MENU (menu),
+  gtk_menu_popup (GTK_MENU (priv->context_menu),
                   NULL,
                   NULL,
-                  (GtkMenuPositionFunc) position_menu,
+                  (GtkMenuPositionFunc) position_context_menu,
                   GTK_WIDGET (button),
                   0,
                   gtk_get_current_event_time ());
 }
 
 static void
-cb_context_menu_detach (GtkWidget *button,
-                        GtkMenu *menu)
+cb_context_menu_deactivate (GtkMenuShell *menu,
+                            GtkWidget *attach_widget)
 {
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
-  gtk_widget_destroy (GTK_WIDGET (menu));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (attach_widget), FALSE);
 }
 
 static void
-position_menu (GtkMenu *menu,
-               gint *x,
-               gint *y,
-               gboolean *push_in,
-               GtkWidget *widget)
+position_context_menu (GtkMenu *menu,
+                       gint *x,
+                       gint *y,
+                       gboolean *push_in,
+                       GtkWidget *widget)
 {
   GtkRequisition        menu_req;
   gint                  root_x;

Modified: xfmpc/trunk/src/extended-interface.h
===================================================================
--- xfmpc/trunk/src/extended-interface.h	2008-04-20 16:45:17 UTC (rev 4637)
+++ xfmpc/trunk/src/extended-interface.h	2008-04-20 19:39:57 UTC (rev 4638)
@@ -42,6 +42,9 @@
 void                    xfmpc_extended_interface_append_child   (XfmpcExtendedInterface *extended_interface,
                                                                  GtkWidget *child,
                                                                  const gchar *title);
+void                    xfmpc_extended_interface_context_menu_new
+                                                                (XfmpcExtendedInterface *extended_interface,
+                                                                 GtkWidget *attach_widget);
 G_END_DECLS
 
 #endif

Modified: xfmpc/trunk/src/mpdclient.c
===================================================================
--- xfmpc/trunk/src/mpdclient.c	2008-04-20 16:45:17 UTC (rev 4637)
+++ xfmpc/trunk/src/mpdclient.c	2008-04-20 19:39:57 UTC (rev 4638)
@@ -42,6 +42,8 @@
   SIG_VOLUME_CHANGED,
   SIG_STOPPED,
   SIG_PLAYLIST_CHANGED,
+  SIG_REPEAT,
+  SIG_RANDOM,
   LAST_SIGNAL
 };
 
@@ -72,6 +74,8 @@
   void (*volume_changed)    (XfmpcMpdclient *mpdclient, gint volume, gpointer user_data);
   void (*stopped)           (XfmpcMpdclient *mpdclient, gpointer user_data);
   void (*playlist_changed)  (XfmpcMpdclient *mpdclient, gpointer user_data);
+  void (*repeat)            (XfmpcMpdclient *mpdclient, gboolean repeat, gpointer user_data);
+  void (*random)            (XfmpcMpdclient *mpdclient, gboolean random, gpointer user_data);
 };
 
 struct _XfmpcMpdclient
@@ -193,6 +197,24 @@
                   NULL, NULL,
                   g_cclosure_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
+
+  xfmpc_mpdclient_signals[SIG_REPEAT] =
+    g_signal_new ("repeat", G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, repeat),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__BOOLEAN,
+                  G_TYPE_NONE, 1,
+                  G_TYPE_BOOLEAN);
+
+  xfmpc_mpdclient_signals[SIG_RANDOM] =
+    g_signal_new ("random", G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, random),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__BOOLEAN,
+                  G_TYPE_NONE, 1,
+                  G_TYPE_BOOLEAN);
 }
 
 static void
@@ -369,6 +391,18 @@
 }
 
 gboolean
+xfmpc_mpdclient_set_song_time (XfmpcMpdclient *mpdclient,
+                               guint time)
+{
+  XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
+
+  if (mpd_player_seek (priv->mi, time) != MPD_OK)
+    return FALSE;
+  else
+    return TRUE;
+}
+
+gboolean
 xfmpc_mpdclient_set_volume (XfmpcMpdclient *mpdclient,
                             guint8 volume)
 {
@@ -381,19 +415,31 @@
 }
 
 gboolean
-xfmpc_mpdclient_set_song_time (XfmpcMpdclient *mpdclient,
-                               guint time)
+xfmpc_mpdclient_set_repeat (XfmpcMpdclient *mpdclient,
+                            gboolean repeat)
 {
   XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
 
-  if (mpd_player_seek (priv->mi, time) != MPD_OK)
+  if (MPD_OK != mpd_player_set_repeat (priv->mi, repeat))
     return FALSE;
   else
     return TRUE;
 }
 
+gboolean
+xfmpc_mpdclient_set_random (XfmpcMpdclient *mpdclient,
+                            gboolean random)
+{
+  XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
 
+  if (MPD_OK != mpd_player_set_random (priv->mi, random))
+    return FALSE;
+  else
+    return TRUE;
+}
 
+
+
 gint
 xfmpc_mpdclient_get_pos (XfmpcMpdclient *mpdclient)
 {
@@ -500,6 +546,21 @@
 }
 
 gboolean
+xfmpc_mpdclient_get_repeat (XfmpcMpdclient *mpdclient)
+{
+  XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
+
+  return mpd_player_get_repeat (priv->mi);
+}
+
+gboolean
+xfmpc_mpdclient_get_random (XfmpcMpdclient *mpdclient)
+{
+  XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
+
+  return mpd_player_get_random (priv->mi);
+}
+gboolean
 xfmpc_mpdclient_is_playing (XfmpcMpdclient *mpdclient)
 {
   XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
@@ -557,6 +618,14 @@
     g_signal_emit_by_name (mpdclient, "time-changed",
                            xfmpc_mpdclient_get_time (mpdclient),
                            xfmpc_mpdclient_get_total_time (mpdclient));
+
+  if (what & MPD_CST_REPEAT)
+    g_signal_emit_by_name (mpdclient, "repeat",
+                           xfmpc_mpdclient_get_repeat (mpdclient));
+
+  if (what & MPD_CST_RANDOM)
+    g_signal_emit_by_name (mpdclient, "random",
+                           xfmpc_mpdclient_get_random (mpdclient));
 }
 
 

Modified: xfmpc/trunk/src/mpdclient.h
===================================================================
--- xfmpc/trunk/src/mpdclient.h	2008-04-20 16:45:17 UTC (rev 4637)
+++ xfmpc/trunk/src/mpdclient.h	2008-04-20 19:39:57 UTC (rev 4638)
@@ -59,10 +59,14 @@
 
 gboolean                xfmpc_mpdclient_set_id                  (XfmpcMpdclient *mpdclient,
                                                                  gint id);
+gboolean                xfmpc_mpdclient_set_song_time           (XfmpcMpdclient *mpdclient,
+                                                                 guint time);
 gboolean                xfmpc_mpdclient_set_volume              (XfmpcMpdclient *mpdclient,
                                                                  guint8 volume);
-gboolean                xfmpc_mpdclient_set_song_time           (XfmpcMpdclient *mpdclient,
-                                                                 guint time);
+gboolean                xfmpc_mpdclient_set_repeat              (XfmpcMpdclient *mpdclient,
+                                                                 gboolean repeat);
+gboolean                xfmpc_mpdclient_set_random              (XfmpcMpdclient *mpdclient,
+                                                                 gboolean random);
 gint                    xfmpc_mpdclient_get_pos                 (XfmpcMpdclient *mpdclient);
 
 gint                    xfmpc_mpdclient_get_id                  (XfmpcMpdclient *mpdclient);
@@ -81,6 +85,10 @@
 
 guint8                  xfmpc_mpdclient_get_volume              (XfmpcMpdclient *mpdclient);
 
+gboolean                xfmpc_mpdclient_get_repeat              (XfmpcMpdclient *mpdclient);
+
+gboolean                xfmpc_mpdclient_get_repeat              (XfmpcMpdclient *mpdclient);
+
 gboolean                xfmpc_mpdclient_is_playing              (XfmpcMpdclient *mpdclient);
 
 gboolean                xfmpc_mpdclient_is_stopped              (XfmpcMpdclient *mpdclient);




More information about the Goodies-commits mailing list