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

Mike Massonnet mmassonnet at xfce.org
Fri Feb 8 12:35:15 CET 2008


Author: mmassonnet
Date: 2008-02-08 11:35:15 +0000 (Fri, 08 Feb 2008)
New Revision: 3933

Modified:
   xfmpc/trunk/src/interface.c
   xfmpc/trunk/src/mpdclient.c
   xfmpc/trunk/src/mpdclient.h
Log:
* src/mpdclient.c,
  src/mpdclient.h:
  - Replace code with StatusField against signals
* src/interface.c:
  - Connect to XfmpcClient signals


Modified: xfmpc/trunk/src/interface.c
===================================================================
--- xfmpc/trunk/src/interface.c	2008-02-08 11:35:09 UTC (rev 3932)
+++ xfmpc/trunk/src/interface.c	2008-02-08 11:35:15 UTC (rev 3933)
@@ -60,9 +60,20 @@
                                                                  XfmpcInterface *interface);
 static void             xfmpc_interface_action_volume           (GtkAction *action,
                                                                  XfmpcInterface *interface);
+static void             cb_song_changed                         (XfmpcInterface *interface);
 
+static void             cb_pp_changed                           (XfmpcInterface *interface,
+                                                                 gboolean is_playing);
+static void             cb_time_changed                         (XfmpcInterface *interface,
+                                                                 gint time,
+                                                                 gint total_time);
+static void             cb_volume_changed                       (XfmpcInterface *interface,
+                                                                 gint volume);
+static void             cb_stopped                              (XfmpcInterface *interface);
 
 
+
+
 struct _XfmpcInterfaceClass
 {
   GtkWindowClass            parent_class;
@@ -86,6 +97,7 @@
   GtkWidget                *progress_bar; /* position in song */
   GtkWidget                *title;
   GtkWidget                *subtitle;
+  gboolean                  refresh_title;
 };
 
 
@@ -275,6 +287,17 @@
   g_signal_connect_swapped (progress_box, "button-press-event",
                             G_CALLBACK (xfmpc_interface_progress_box_press_event), interface);
 
+  g_signal_connect_swapped (interface->mpdclient, "song-changed",
+                            G_CALLBACK (cb_song_changed), interface);
+  g_signal_connect_swapped (interface->mpdclient, "pp-changed",
+                            G_CALLBACK (cb_pp_changed), interface);
+  g_signal_connect_swapped (interface->mpdclient, "time-changed",
+                            G_CALLBACK (cb_time_changed), interface);
+  g_signal_connect_swapped (interface->mpdclient, "volume-changed",
+                            G_CALLBACK (cb_volume_changed), interface);
+  g_signal_connect_swapped (interface->mpdclient, "stopped",
+                            G_CALLBACK (cb_stopped), interface);
+
   /* === Timeout === */
   g_timeout_add (1000, (GSourceFunc)xfmpc_interface_refresh, interface);
 }
@@ -408,8 +431,6 @@
 static gboolean
 xfmpc_interface_refresh (XfmpcInterface *interface)
 {
-  gchar                *text = NULL;
-
   if (G_UNLIKELY (xfmpc_mpdclient_connect (interface->mpdclient) == FALSE))
     {
       g_warning ("Failed to connect to MPD");
@@ -427,55 +448,6 @@
 
   xfmpc_mpdclient_update_status (interface->mpdclient);
 
-  if (G_UNLIKELY (xfmpc_mpdclient_status (interface->mpdclient, VOLUME_CHANGED)))
-    {
-      /* volume */
-      xfmpc_interface_set_volume (interface, xfmpc_mpdclient_get_volume (interface->mpdclient));
-    }
-
-  if (G_UNLIKELY (xfmpc_mpdclient_is_stopped (interface->mpdclient)))
-    {
-      /* stopped */
-      if (xfmpc_mpdclient_status (interface->mpdclient, STOP_CHANGED))
-        {
-          xfmpc_interface_set_pp (interface, FALSE);
-          xfmpc_interface_set_time (interface, 0, 0);
-          xfmpc_interface_set_title (interface, _("Stopped"));
-          xfmpc_interface_set_subtitle (interface, PACKAGE_STRING);
-        }
-
-      return TRUE;
-    }
-
-  if (G_LIKELY (xfmpc_mpdclient_status (interface->mpdclient, TIME_CHANGED)))
-    {
-      /* song time */
-      xfmpc_interface_set_time (interface,
-                                xfmpc_mpdclient_get_time (interface->mpdclient),
-                                xfmpc_mpdclient_get_total_time (interface->mpdclient));
-    }
-
-  if (G_UNLIKELY (xfmpc_mpdclient_status (interface->mpdclient, PP_CHANGED)))
-    {
-      /* play/pause */
-      xfmpc_interface_set_pp (interface, xfmpc_mpdclient_is_playing (interface->mpdclient));
-    }
-
-  if (G_UNLIKELY (xfmpc_mpdclient_status (interface->mpdclient, SONG_CHANGED)))
-    {
-      /* title */
-      xfmpc_interface_set_title (interface, xfmpc_mpdclient_get_title (interface->mpdclient));
-
-      /* subtitle "by \"artist\" from \"album\" (year)" */
-      text = g_strdup_printf (_("by \"%s\" from \"%s\" (%s)"),
-                              xfmpc_mpdclient_get_artist (interface->mpdclient),
-                              xfmpc_mpdclient_get_album (interface->mpdclient),
-                              xfmpc_mpdclient_get_date (interface->mpdclient));
-      /* text = xfmpc_interface_get_subtitle (interface); to avoid "n/a" values */
-      xfmpc_interface_set_subtitle (interface, text);
-      g_free (text);
-    }
-
   return TRUE;
 }
 
@@ -529,9 +501,68 @@
   return FALSE;
 }
 
+static void
+cb_song_changed (XfmpcInterface *interface)
+{
+  /* title */
+  xfmpc_interface_set_title (interface, xfmpc_mpdclient_get_title (interface->mpdclient));
 
+  /* subtitle "by \"artist\" from \"album\" (year)" */
+  gchar *text = g_strdup_printf (_("by \"%s\" from \"%s\" (%s)"),
+                                 xfmpc_mpdclient_get_artist (interface->mpdclient),
+                                 xfmpc_mpdclient_get_album (interface->mpdclient),
+                                 xfmpc_mpdclient_get_date (interface->mpdclient));
+  /* text = xfmpc_interface_get_subtitle (interface); to avoid "n/a" values, so far I don't care */
+  xfmpc_interface_set_subtitle (interface, text);
+  g_free (text);
+}
 
 static void
+cb_pp_changed (XfmpcInterface *interface,
+               gboolean is_playing)
+{
+  XfmpcInterfacePrivate *priv = XFMPC_INTERFACE_GET_PRIVATE (interface);
+
+  xfmpc_interface_set_pp (interface, is_playing);
+
+  if (priv->refresh_title)
+    {
+      cb_song_changed (interface);
+      priv->refresh_title = FALSE;
+    }
+}
+
+static void
+cb_time_changed (XfmpcInterface *interface,
+                 gint time,
+                 gint total_time)
+{
+  xfmpc_interface_set_time (interface, time, total_time);
+}
+
+static void
+cb_volume_changed (XfmpcInterface *interface,
+                   gint volume)
+{
+  xfmpc_interface_set_volume (interface, volume);
+}
+
+static void
+cb_stopped (XfmpcInterface *interface)
+{
+  XfmpcInterfacePrivate *priv = XFMPC_INTERFACE_GET_PRIVATE (interface);
+
+  xfmpc_interface_set_pp (interface, FALSE);
+  xfmpc_interface_set_time (interface, 0, 0);
+  xfmpc_interface_set_title (interface, _("Stopped"));
+  xfmpc_interface_set_subtitle (interface, PACKAGE_STRING);
+
+  priv->refresh_title = TRUE;
+}
+
+
+
+static void
 xfmpc_interface_action_previous (GtkAction *action,
                                  XfmpcInterface *interface)
 {

Modified: xfmpc/trunk/src/mpdclient.c
===================================================================
--- xfmpc/trunk/src/mpdclient.c	2008-02-08 11:35:09 UTC (rev 3932)
+++ xfmpc/trunk/src/mpdclient.c	2008-02-08 11:35:15 UTC (rev 3933)
@@ -33,6 +33,20 @@
 
 
 
+enum
+{
+  SIG_SONG_CHANGED,
+  SIG_PP_CHANGED,
+  SIG_TIME_CHANGED,
+  SIG_VOLUME_CHANGED,
+  SIG_STOPPED,
+  LAST_SIGNAL
+};
+
+static guint            xfmpc_mpdclient_signals[LAST_SIGNAL] = { 0 };
+
+
+
 static void             xfmpc_mpdclient_class_init              (XfmpcMpdclientClass *klass);
 static void             xfmpc_mpdclient_init                    (XfmpcMpdclient *mpdclient);
 static void             xfmpc_mpdclient_finalize                (GObject *object);
@@ -48,6 +62,12 @@
 struct _XfmpcMpdclientClass
 {
   GObjectClass              parent_class;
+
+  void (*song_changed)      (XfmpcMpdclient *mpdclient, gpointer user_data);
+  void (*pp_changed)        (XfmpcMpdclient *mpdclient, gboolean is_playing, gpointer user_data);
+  void (*time_changed)      (XfmpcMpdclient *mpdclient, gint time, gint total_time, gpointer user_data);
+  void (*volume_changed)    (XfmpcMpdclient *mpdclient, gint volume, gpointer user_data);
+  void (*stopped)           (XfmpcMpdclient *mpdclient, gpointer user_data);
 };
 
 struct _XfmpcMpdclient
@@ -62,8 +82,6 @@
   gchar                    *host;
   guint                     port;
   gchar                    *passwd;
-
-  StatusField               status;
 };
 
 
@@ -111,6 +129,50 @@
 
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = xfmpc_mpdclient_finalize;
+
+  xfmpc_mpdclient_signals[SIG_SONG_CHANGED] =
+    g_signal_new ("song-changed", G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, song_changed),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
+  xfmpc_mpdclient_signals[SIG_PP_CHANGED] =
+    g_signal_new ("pp-changed", G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, pp_changed),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__BOOLEAN,
+                  G_TYPE_NONE, 1,
+                  G_TYPE_BOOLEAN);
+
+  xfmpc_mpdclient_signals[SIG_TIME_CHANGED] =
+    g_signal_new ("time-changed", G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, pp_changed),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__UINT_POINTER,
+                  G_TYPE_NONE, 2,
+                  G_TYPE_INT,
+                  G_TYPE_INT);
+
+  xfmpc_mpdclient_signals[SIG_VOLUME_CHANGED] =
+    g_signal_new ("volume-changed", G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, pp_changed),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__INT,
+                  G_TYPE_NONE, 1,
+                  G_TYPE_INT);
+
+  xfmpc_mpdclient_signals[SIG_STOPPED] =
+    g_signal_new ("stopped", G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (XfmpcMpdclientClass, pp_changed),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
 }
 
 static void
@@ -408,58 +470,34 @@
   mpd_status_update (priv->mi);
 }
 
-gboolean
-xfmpc_mpdclient_status (XfmpcMpdclient *mpdclient,
-                        gint bits)
-{
-  XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
-
-  if (priv->status & bits)
-    {
-      priv->status &= ~bits;
-      return TRUE;
-    }
-
-  return FALSE;
-}
-
 static void
 cb_xfmpc_mpdclient_status_changed (MpdObj *mi,
                                    ChangedStatusType what,
                                    gpointer user_data)
 {
-  XfmpcMpdclient *mpdclient = user_data;
+  XfmpcMpdclient *mpdclient = XFMPC_MPDCLIENT (user_data);
   g_return_if_fail (G_LIKELY (NULL != user_data));
-  XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
 
   if (what & MPD_CST_STATE)
     {
-      switch (mpd_player_get_state (mi))
-        {
-        case MPD_PLAYER_STOP:
-          priv->status |= STOP_CHANGED;
-          priv->status |= SONG_CHANGED; /* as to say that the next time the
-                                           song plays again, it needs to update
-                                           its title in the interface */
-          break;
-
-        case MPD_PLAYER_PLAY:
-        case MPD_PLAYER_PAUSE:
-          priv->status |= PP_CHANGED;
-          break;
-
-        default:
-          break;
-        }
+      gint state = mpd_player_get_state (mi);
+      if (state == MPD_PLAYER_STOP)
+        g_signal_emit_by_name (mpdclient, "stopped");
+      else if (state == MPD_PLAYER_PLAY || state == MPD_PLAYER_PAUSE)
+        g_signal_emit_by_name (mpdclient, "pp-changed",
+                               state == MPD_PLAYER_PLAY);
     }
 
   if (what & MPD_CST_SONGID)
-    priv->status |= SONG_CHANGED;
+    g_signal_emit_by_name (mpdclient, "song-changed");
 
   if (what & MPD_CST_VOLUME)
-    priv->status |= VOLUME_CHANGED;
+    g_signal_emit_by_name (mpdclient, "volume-changed",
+                           xfmpc_mpdclient_get_volume (mpdclient));
 
   if (what & (MPD_CST_ELAPSED_TIME|MPD_CST_TOTAL_TIME))
-    priv->status |= TIME_CHANGED;
+    g_signal_emit_by_name (mpdclient, "time-changed",
+                           xfmpc_mpdclient_get_time (mpdclient),
+                           xfmpc_mpdclient_get_total_time (mpdclient));
 }
 

Modified: xfmpc/trunk/src/mpdclient.h
===================================================================
--- xfmpc/trunk/src/mpdclient.h	2008-02-08 11:35:09 UTC (rev 3932)
+++ xfmpc/trunk/src/mpdclient.h	2008-02-08 11:35:15 UTC (rev 3933)
@@ -31,15 +31,6 @@
 
 #define XFMPC_MPDCLIENT_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS ((obj), XFMPC_TYPE_MPDCLIENT, XfmpcMpdclientClass))
 
-typedef enum
-{
-  STOP_CHANGED          = 1 << 0,
-  PP_CHANGED            = 1 << 1,
-  SONG_CHANGED          = 1 << 2,
-  VOLUME_CHANGED        = 1 << 3,
-  TIME_CHANGED          = 1 << 4,
-} StatusField;
-
 typedef struct _XfmpcMpdclientClass         XfmpcMpdclientClass;
 typedef struct _XfmpcMpdclient              XfmpcMpdclient;
 typedef struct _XfmpcMpdclientPrivate       XfmpcMpdclientPrivate;
@@ -90,9 +81,6 @@
 
 void                    xfmpc_mpdclient_update_status           (XfmpcMpdclient *mpdclient);
 
-gboolean                xfmpc_mpdclient_status                  (XfmpcMpdclient *mpdclient,
-                                                                 gint bits);
-
 G_END_DECLS
 
 #endif




More information about the Goodies-commits mailing list