[Goodies-commits] r7853 - in parole/trunk: . data/interfaces parole plugins/tray

Ali Abdallah aliov at xfce.org
Tue Jul 28 09:57:58 CEST 2009


Author: aliov
Date: 2009-07-28 07:57:58 +0000 (Tue, 28 Jul 2009)
New Revision: 7853

Modified:
   parole/trunk/ChangeLog
   parole/trunk/TODO
   parole/trunk/data/interfaces/parole.ui
   parole/trunk/parole/main.c
   parole/trunk/parole/parole-gst.c
   parole/trunk/parole/parole-player.c
   parole/trunk/parole/parole-plugin.c
   parole/trunk/parole/parole-plugin.h
   parole/trunk/parole/parole-plugins-manager.c
   parole/trunk/parole/parole-statusbar.c
   parole/trunk/parole/parole-statusbar.h
   parole/trunk/plugins/tray/tray-icon.c
Log:
	* tray-icon plugin: Show the base filename if we don't have
	the tag title.
	* main.c: Added show_version function+reorder calls of gst_init and
	gtk_init.
	* parole-statusbar.c Much better statusbar info.
	* parole-gst.c don't try to load subtitles for non local files.
	* Handle all  'prepare-xwindow-id' message synchronously to avoid
	XSync error in some occasions.
	* Handle Failure in Changing state async to query the bus of 
	the real error message.

Modified: parole/trunk/ChangeLog
===================================================================
--- parole/trunk/ChangeLog	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/ChangeLog	2009-07-28 07:57:58 UTC (rev 7853)
@@ -1,3 +1,15 @@
+2009-07-28: Ali aliov at xfce.org
+	* tray-icon plugin: Show the base filename if we don't have
+	the tag title.
+	* main.c: Added show_version function+reorder calls of gst_init and
+	gtk_init.
+	* parole-statusbar.c Much better statusbar info.
+	* parole-gst.c don't try to load subtitles for non local files.
+	* Handle all  'prepare-xwindow-id' message synchronously to avoid
+	XSync error in some occasions.
+	* Handle Failure in Changing state async to query the bus of 
+	the real error message.
+
 2009-07-27: 22:00 Ali aliov at xfce.org
 	* Fix a wrong pixbuf name introduced in the previous commit.
 	* Add missing support for packing plugins in the main notebook.

Modified: parole/trunk/TODO
===================================================================
--- parole/trunk/TODO	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/TODO	2009-07-28 07:57:58 UTC (rev 7853)
@@ -1,11 +1,11 @@
 === Media player ===
-* Better statusbar information.
-* Complete the settings dialog.
+* Brightness and contrast support.
 * Complete the shortcut keys.
+* Repeat and Shuffle mode.
 * Better support for cdda.
 * Move to next chapter in movie.
-* Brightness and contrast support.
 * Probably something like totem-fullscreen?
+* Handle missing gstreamer plugins.
 * Support some playlist title entity.
 * ...
 

Modified: parole/trunk/data/interfaces/parole.ui
===================================================================
--- parole/trunk/data/interfaces/parole.ui	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/data/interfaces/parole.ui	2009-07-28 07:57:58 UTC (rev 7853)
@@ -398,18 +398,23 @@
           </packing>
         </child>
         <child>
-          <object class="GtkHBox" id="statusbox">
+          <object class="GtkAlignment" id="alignment1">
             <property name="visible">True</property>
-            <property name="no_show_all">True</property>
-            <property name="spacing">5</property>
+            <property name="left_padding">5</property>
+            <property name="right_padding">5</property>
             <child>
-              <placeholder/>
+              <object class="GtkHBox" id="statusbox">
+                <property name="visible">True</property>
+                <property name="no_show_all">True</property>
+                <property name="spacing">5</property>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
             </child>
           </object>
           <packing>
             <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="padding">2</property>
             <property name="position">2</property>
           </packing>
         </child>

Modified: parole/trunk/parole/main.c
===================================================================
--- parole/trunk/parole/main.c	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/parole/main.c	2009-07-28 07:57:58 UTC (rev 7853)
@@ -46,6 +46,18 @@
 #include "parole-dbus.h"
 #include "parole-builder.h"
 
+static void G_GNUC_NORETURN
+show_version (void)
+{
+    g_print (_("\n"
+             "Parole Media Player %s\n\n"
+             "Part of the Xfce Goodies Project\n"
+             "http://goodies.xfce.org\n\n"
+             "Licensed under the GNU GPL.\n\n"), VERSION);
+
+    exit (EXIT_SUCCESS);
+}
+
 static void
 parole_send_play_disc (DBusGProxy *proxy, const gchar *uri)
 {
@@ -129,10 +141,12 @@
     GError *error = NULL;
     gchar **filenames = NULL;
     gboolean new_instance = FALSE;
+    gboolean version = FALSE;
     
     GOptionEntry option_entries[] = 
     {
 	{"new-instance", 'i', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &new_instance, N_("Open a new instance"), NULL },
+	{ "version", 'V', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &version, N_("Version information"), NULL },
 	{G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, N_("Media to play"), NULL},
         { NULL, },
     };
@@ -142,8 +156,6 @@
 
     xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
     
-    gst_init (&argc, &argv);
-    
     if ( !gtk_init_with_args (&argc, &argv, (gchar *)"", option_entries, (gchar *)PACKAGE, &error))
     {
 	if (G_LIKELY (error) ) 
@@ -161,6 +173,11 @@
         return EXIT_FAILURE;
     }
 
+    if ( version )
+	show_version ();
+
+    gst_init (NULL, NULL);
+
     if ( !new_instance && parole_dbus_name_has_owner (PAROLE_DBUS_NAME) )
     {
 	TRACE ("Parole is already running");

Modified: parole/trunk/parole/parole-gst.c
===================================================================
--- parole/trunk/parole/parole-gst.c	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/parole/parole-gst.c	2009-07-28 07:57:58 UTC (rev 7853)
@@ -56,6 +56,7 @@
     GstElement	 *playbin;
     GstElement   *video_sink;
     GstElement   *vis_sink;
+    GstBus       *bus;
     
     GMutex       *lock;
     GstState      state;
@@ -100,8 +101,10 @@
 	g_source_remove (gst->priv->tick_id);
 	
     parole_stream_init_properties (gst->priv->stream);
+    
     g_object_unref (gst->priv->stream);
     g_object_unref (gst->priv->playbin);
+    g_object_unref (gst->priv->bus);
     
     g_object_unref (gst->priv->logo);
     g_mutex_free (gst->priv->lock);
@@ -442,11 +445,19 @@
 static void
 parole_gst_load_subtitle (ParoleGst *gst)
 {
+    ParoleMediaType type;
     gchar *uri;
     gchar *sub;
     gchar *sub_uri;
     gboolean sub_enabled;
     
+    g_object_get (G_OBJECT (gst->priv->stream),
+		  "media-type", &type,
+		  NULL);
+    
+    if ( type != PAROLE_MEDIA_TYPE_LOCAL_FILE )
+	return;
+    
     g_object_get (G_OBJECT (gst->priv->conf),
 		  "enable-subtitle", &sub_enabled,
 		  NULL);
@@ -458,6 +469,7 @@
 		  "uri", &uri,
 		  NULL);
 	
+    
     sub = parole_get_subtitle_path (uri);
 
     if ( sub )
@@ -585,9 +597,6 @@
 	    if ( gst->priv->update)
 		parole_gst_update_vis (gst);
 		
-	    if ( gst->priv->target == GST_STATE_PLAYING)
-		parole_gst_set_x_overlay (gst);
-	
 	    gst->priv->media_state = PAROLE_MEDIA_STATE_STOPPED;
 	    g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0, 
 			   gst->priv->stream, PAROLE_MEDIA_STATE_STOPPED);
@@ -616,7 +625,7 @@
 }
 
 static void
-parole_gst_handle_element_message (ParoleGst *gst, GstMessage *message)
+parole_gst_element_message_sync (GstBus *bus, GstMessage *message, ParoleGst *gst)
 {
     if ( !message->structure )
 	goto out;
@@ -705,12 +714,14 @@
 	    gchar *debug;
 	    parole_gst_set_window_cursor (GTK_WIDGET (gst)->window, NULL);
 	    gst->priv->target = GST_STATE_NULL;
+	    gst->priv->buffering = FALSE;
 	    parole_gst_change_state (gst, GST_STATE_NULL);
 	    gst_message_parse_error (msg, &error, &debug);
 	    TRACE ("*** ERROR %s : %s ***", error->message, debug);
 	    g_signal_emit (G_OBJECT (gst), signals [ERROR], 0, error->message);
 	    g_error_free (error);
 	    g_free (debug);
+	    gtk_widget_queue_draw (GTK_WIDGET (gst));
 	    break;
 	}
 	case GST_MESSAGE_BUFFERING:
@@ -767,9 +778,6 @@
 	case GST_MESSAGE_APPLICATION:
 	    TRACE ("Application message");
 	    break;
-	case GST_MESSAGE_ELEMENT:
-	    parole_gst_handle_element_message (gst, msg);
-	    break;
 	case GST_MESSAGE_SEGMENT_START:
 	    break;
 	case GST_MESSAGE_DURATION:
@@ -804,10 +812,9 @@
 	case GST_STATE_CHANGE_ASYNC:
 	    TRACE ("State will change async");
 	    break;
+	
 	case GST_STATE_CHANGE_FAILURE:
-	    gst->priv->target = GST_STATE_NULL;
-	    parole_gst_change_state (gst, GST_STATE_NULL);
-	    g_signal_emit (G_OBJECT (gst), signals [ERROR], 0, _("Error in changing state to ready"));
+	    TRACE ("Error will be handled async");
 	    break;
 	case GST_STATE_CHANGE_NO_PREROLL:
 	    TRACE ("State change no_preroll");
@@ -818,6 +825,16 @@
 }
 
 static void
+parole_gst_stream_info_notify_cb (GObject * obj, GParamSpec * pspec, ParoleGst *gst)
+{
+    GstMessage *msg;
+    TRACE ("Stream info changed?");
+    msg = gst_message_new_application (GST_OBJECT (gst->priv->playbin),
+				       gst_structure_new ("notify-streaminfo", NULL));
+    gst_element_post_message (gst->priv->playbin, msg);
+}
+
+static void
 parole_gst_play_file_internal (ParoleGst *gst)
 {
     gchar *uri;
@@ -848,7 +865,6 @@
 parole_gst_construct (GObject *object)
 {
     ParoleGst *gst;
-    GstBus *bus;
     
     gst = PAROLE_GST (object);
     
@@ -886,12 +902,25 @@
     /*
      * Listen to the bus events.
      */
-    bus = gst_pipeline_get_bus (GST_PIPELINE (gst->priv->playbin));
-    gst_bus_add_watch (bus, parole_gst_bus_event, gst);
-    g_object_unref (bus);
+    gst->priv->bus = gst_element_get_bus (gst->priv->playbin);
+    gst_bus_add_signal_watch (gst->priv->bus);
     
+    g_signal_connect (gst->priv->bus, "message",
+		      G_CALLBACK (parole_gst_bus_event), gst);
+		      
+    /* Handling 'prepare-xwindow-id' message async causes XSync error in some occasions
+     * So we handle this message synchronously*/
+    gst_bus_set_sync_handler (gst->priv->bus, gst_bus_sync_signal_handler, gst);
+    g_signal_connect (gst->priv->bus, "sync-message::element",
+		      G_CALLBACK (parole_gst_element_message_sync), gst);
+
+    /*
+     * Handle stream info changes, this can happen on live/radio stream.
+     */
+    g_signal_connect (gst->priv->playbin, "notify::stream-info",
+		      G_CALLBACK (parole_gst_stream_info_notify_cb), gst);
+      
     parole_gst_load_logo (gst);
-    
     parole_gst_set_subtitle_encoding (gst);
     parole_gst_set_subtitle_font (gst);
 }
@@ -984,9 +1013,6 @@
     {
 	parole_gst_set_subtitle_encoding (gst);
     }
-    
-    
-
 }
 
 static void

Modified: parole/trunk/parole/parole-player.c
===================================================================
--- parole/trunk/parole/parole-player.c	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/parole/parole-player.c	2009-07-28 07:57:58 UTC (rev 7853)
@@ -267,9 +267,6 @@
     {
 	parole_player_change_range_value (player, value);
     }
-    parole_statusbar_set_position (player->priv->status, 
-				   player->priv->state == PAROLE_MEDIA_STATE_PLAYING,
-				   value);
 }
 
 static void
@@ -375,12 +372,10 @@
     
     if ( seekable )
     {
-	parole_statusbar_set_duration (player->priv->status, duration);
 	gtk_range_set_range (GTK_RANGE (player->priv->range), 0, duration);
     }
     else
     {
-	parole_statusbar_set_text (player->priv->status, _("Playing"));
 	gtk_widget_set_tooltip_text (GTK_WIDGET (player->priv->range), _("Media stream is not seekable"));
 	parole_player_change_range_value (player, 0);
     }
@@ -400,9 +395,6 @@
     
     TRACE ("Player paused");
     
-    if ( !player->priv->buffering )
-	parole_statusbar_set_text (player->priv->status, _("Paused"));
-	
     pix = xfce_themed_icon_load ("gtk-media-pause", 16);
     parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, pix);
     
@@ -414,7 +406,6 @@
     if ( pix )
 	g_object_unref (pix);
 	
-    parole_statusbar_set_text (player->priv->status, _("Paused"));
 }
 
 static void
@@ -432,8 +423,6 @@
     
     player->priv->state = PAROLE_MEDIA_STATE_STOPPED;
     
-    parole_statusbar_set_text (player->priv->status, _("Stopped"));
-    
     gtk_widget_set_sensitive (player->priv->play_pause, FALSE);
     
     /* Set the stop widget insensitive only if we are not going to got to playing
@@ -626,7 +615,6 @@
     else
     {
 	player->priv->buffering = TRUE;
-	parole_statusbar_set_buffering (player->priv->status, percentage);
 	
 	if ( player->priv->state == PAROLE_MEDIA_STATE_PLAYING )
 	    parole_gst_pause (PAROLE_GST (player->priv->gst));

Modified: parole/trunk/parole/parole-plugin.c
===================================================================
--- parole/trunk/parole/parole-plugin.c	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/parole/parole-plugin.c	2009-07-28 07:57:58 UTC (rev 7853)
@@ -66,6 +66,8 @@
     /* sig id's*/
     gulong gst_sig1;
     gulong gst_sig2;
+    gulong gst_sig3;
+    gulong gst_sig4;
 };
 
 enum
@@ -82,6 +84,8 @@
 {
     STATE_CHANGED,
     TAG_MESSAGE,
+    PROGRESSED,
+    BUFFERING,
     FREE_DATA,
     CONFIGURE,
     ABOUT,
@@ -106,6 +110,20 @@
 }
 
 static void
+parole_plugin_buffering_changed_cb (ParoleGst *gst, const ParoleStream *stream, 
+				    gint percentage, ParolePlugin *plugin)
+{
+    g_signal_emit (G_OBJECT (plugin), signals [BUFFERING], 0, stream, percentage);
+}
+
+static void
+parole_plugin_media_progressed_cb (ParoleGst *gst, const ParoleStream *stream,
+				   gdouble value, ParolePlugin *plugin)
+{
+    g_signal_emit (G_OBJECT (plugin), signals [PROGRESSED], 0, stream, value);
+}
+
+static void
 parole_plugin_class_init (ParolePluginClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -148,8 +166,42 @@
                       NULL, NULL,
 		      g_cclosure_marshal_VOID__OBJECT,
                       G_TYPE_NONE, 1, PAROLE_TYPE_STREAM);
+	
+    /**
+     * ParolePlugin::progressed:
+     * @plugin: the object which received the signal.
+     * @stream: a #ParoleStream.
+     * 
+     * Since: 0.1 
+     **/
+    signals[PROGRESSED] = 
+        g_signal_new ("progressed",
+                      PAROLE_TYPE_PLUGIN,
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (ParolePluginClass, progressed),
+                      NULL, NULL,
+                      _gmarshal_VOID__OBJECT_DOUBLE,
+                      G_TYPE_NONE, 2, 
+		      G_TYPE_OBJECT, G_TYPE_DOUBLE);
 
     /**
+     * ParolePlugin::buffering:
+     * @plugin: the object which received the signal.
+     * @stream: a #ParoleStream.
+     * 
+     * Since: 0.1 
+     **/
+    signals[BUFFERING] = 
+        g_signal_new ("buffering",
+                      PAROLE_TYPE_PLUGIN,
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (ParolePluginClass, buffering),
+                      NULL, NULL,
+                      _gmarshal_VOID__OBJECT_INT,
+                      G_TYPE_NONE, 2, 
+		      G_TYPE_OBJECT, G_TYPE_INT);
+
+    /**
      * ParolePlugin::free-data:
      * @plugin: the object which received the signal.
      * 
@@ -297,6 +349,12 @@
 		      
     priv->gst_sig2 = g_signal_connect (G_OBJECT (priv->gst), "media-tag",
 				       G_CALLBACK (parole_plugin_media_tag_cb), plugin);
+				       
+    priv->gst_sig3 = g_signal_connect (G_OBJECT (priv->gst), "buffering",
+				       G_CALLBACK (parole_plugin_buffering_changed_cb), plugin);
+				       
+    priv->gst_sig4 = g_signal_connect (G_OBJECT (priv->gst), "media-progressed",
+				       G_CALLBACK (parole_plugin_media_progressed_cb), plugin);
 }
 
 static void parole_plugin_set_property (GObject *object,
@@ -378,7 +436,13 @@
 	    g_signal_handler_disconnect (priv->gst, priv->gst_sig1);
 
 	if ( g_signal_handler_is_connected (priv->gst, priv->gst_sig2)) 
-	g_signal_handler_disconnect (priv->gst, priv->gst_sig2);
+	    g_signal_handler_disconnect (priv->gst, priv->gst_sig2);
+	    
+	if ( g_signal_handler_is_connected (priv->gst, priv->gst_sig3)) 
+	    g_signal_handler_disconnect (priv->gst, priv->gst_sig3);
+	    
+	if ( g_signal_handler_is_connected (priv->gst, priv->gst_sig4)) 
+	    g_signal_handler_disconnect (priv->gst, priv->gst_sig4);
     }
     
     if ( priv->title )
@@ -553,7 +617,10 @@
  **/
 gboolean parole_plugin_play_uri (ParolePlugin *plugin, const gchar *uri)
 {
+    g_return_val_if_fail (PAROLE_IS_PLUGIN (plugin), FALSE);
+    g_return_val_if_fail (PAROLE_IS_PLUGIN (uri != NULL), FALSE);
     
+    parole_gst_play_uri (PAROLE_PLUGIN_GET_PRIVATE (plugin)->gst, uri);
     
     return TRUE;
 }
@@ -620,7 +687,9 @@
  **/
 gboolean parole_plugin_seek (ParolePlugin *plugin, gdouble pos)
 {
+    g_return_val_if_fail (PAROLE_IS_PLUGIN (plugin), FALSE);
     
+    parole_gst_seek (PAROLE_PLUGIN_GET_PRIVATE (plugin)->gst, pos);
     
     return TRUE;
 }

Modified: parole/trunk/parole/parole-plugin.h
===================================================================
--- parole/trunk/parole/parole-plugin.h	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/parole/parole-plugin.h	2009-07-28 07:57:58 UTC (rev 7853)
@@ -67,7 +67,15 @@
     
     void		    (*tag_message)                 		(ParolePlugin *plugin,
 									 const ParoleStream *stream);
-    
+
+    void		    (*progressed)	 			(ParolePlugin *gst,
+									 const ParoleStream *stream,
+									 gdouble value);
+
+    void		    (*buffering)		 		(ParolePlugin *plugin,
+									 const ParoleStream *stream,
+									 gint percentage);
+						  
     void		    (*free_data)		   		(ParolePlugin *plugin);
     
     void		    (*configure)				(ParolePlugin *plugin,

Modified: parole/trunk/parole/parole-plugins-manager.c
===================================================================
--- parole/trunk/parole/parole-plugins-manager.c	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/parole/parole-plugins-manager.c	2009-07-28 07:57:58 UTC (rev 7853)
@@ -348,7 +348,6 @@
 static void
 parole_plugins_manager_init (ParolePluginsManager *manager)
 {
-    ParolePlugin *plugin;
     GtkBuilder *builder;
     
     manager->priv = PAROLE_PLUGINS_MANAGER_GET_PRIVATE (manager);
@@ -379,9 +378,6 @@
     parole_plugins_manager_set_show_tabs (GTK_NOTEBOOK (manager->priv->main_nt));
     
     g_object_unref (builder);
-    
-    plugin = parole_plugin_new (NULL, NULL, NULL);
-    g_object_unref (plugin);
 }
 
 static void

Modified: parole/trunk/parole/parole-statusbar.c
===================================================================
--- parole/trunk/parole/parole-statusbar.c	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/parole/parole-statusbar.c	2009-07-28 07:57:58 UTC (rev 7853)
@@ -32,27 +32,179 @@
 
 #include "parole-builder.h"
 #include "parole-statusbar.h"
+#include "parole-plugin.h"
 
 #define PAROLE_STATUSBAR_GET_PRIVATE(o) \
 (G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_STATUSBAR, ParoleStatusbarPrivate))
 
 struct ParoleStatusbarPrivate
 {
-    GtkWidget *box;
-    GtkWidget *progress;
-    GtkWidget *label;
+    ParolePlugin *plugin;
+    GtkWidget    *box;
+    GtkWidget    *progress;
+    GtkWidget    *label_text;
+    GtkWidget    *label_duration;
     
-    gdouble    duration;
+    gdouble       duration;
+    gdouble       pos;
 };
 
 G_DEFINE_TYPE (ParoleStatusbar, parole_statusbar, G_TYPE_OBJECT)
 
+static void 
+parole_statusbar_set_buffering (ParoleStatusbar *bar, gint percentage)
+{
+    gchar *buff;
+    
+    buff = g_strdup_printf ("%s %d%%", _("Buffering"), percentage);
+    
+    gtk_progress_bar_set_text (GTK_PROGRESS_BAR (bar->priv->progress), buff);
+    gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (bar->priv->progress), (gdouble) percentage/100);
+    gtk_widget_hide (bar->priv->label_text);
+    gtk_widget_hide (bar->priv->label_duration);
+    gtk_widget_show (bar->priv->progress);
+    g_free (buff);
+}
+
+static void 
+parole_statusbar_set_duration (ParoleStatusbar *bar, ParoleState state, gdouble position)
+{
+    gchar *text = NULL;
+
+    if ( state == PAROLE_STATE_STOPPED )
+    {
+	gtk_label_set_text (GTK_LABEL (bar->priv->label_duration), _("Stopped"));
+    }
+    else if ( state == PAROLE_STATE_PLAYBACK_FINISHED )
+    {
+	gtk_label_set_text (GTK_LABEL (bar->priv->label_duration), _("Finished"));
+    }
+    else
+    {
+	if ( bar->priv->duration != 0)
+	{
+	    text = g_strdup_printf ("%s %4.2f/%4.2f", 
+				    state == PAROLE_STATE_PAUSED ? _("Paused") : ("Playing"), position, bar->priv->duration);
+	}
+	if ( text )
+	{
+	    gtk_label_set_text (GTK_LABEL (bar->priv->label_duration), text);
+	    g_free (text);
+	}
+	else
+	    gtk_label_set_text (GTK_LABEL (bar->priv->label_duration), state == PAROLE_STATE_PAUSED ? _("Paused") : ("Playing"));
+    }
+}
+
+static void parole_statusbar_set_text (ParoleStatusbar *bar, const ParoleStream *stream, ParoleState state)
+{
+    gchar *text = NULL;
+    gchar *title = NULL;
+    gboolean live;
+    
+    if ( state >= PAROLE_STATE_PAUSED )
+    {
+	g_object_get (G_OBJECT (stream),
+		      "title", &title,
+		      "live", &live,
+		      NULL);
+		      
+	if ( !title )
+	{
+	    gchar *uri;
+	    gchar *filename;
+	    g_object_get (G_OBJECT (stream),
+			  "uri", &uri,
+			  NULL);
+			  
+	    if ( !uri )
+		goto out;
+		
+	    filename = g_filename_from_uri (uri, NULL, NULL);
+	    g_free (uri);
+	    
+	    if ( filename )
+	    {
+		title  = g_path_get_basename (filename);
+		g_free (filename);
+	    }
+	    else
+		goto out;
+	}
+	
+	text = g_strdup_printf ("%s %s", live ? _("Live stream") : " ", title);
+	gtk_label_set_text (GTK_LABEL (bar->priv->label_text), text);
+	g_free (text);
+	return;
+    }
+	
+out:
+    gtk_label_set_text (GTK_LABEL (bar->priv->label_text), NULL);
+}
+
 static void
+parole_statusbar_state_changed_cb (ParolePlugin *gst, const ParoleStream *stream, 
+				   ParoleState state, ParoleStatusbar *statusbar)
+{
+    if ( state >= PAROLE_STATE_PAUSED )
+    {
+	g_object_get (G_OBJECT (stream),
+		      "duration", &statusbar->priv->duration,
+		      NULL);
+    }
+    else 
+    {
+	statusbar->priv->duration = 0;
+	statusbar->priv->pos = 0;
+    }
+	
+    parole_statusbar_set_text (statusbar, stream, state);
+    parole_statusbar_set_duration (statusbar, state, statusbar->priv->pos);
+}
+
+static void
+parole_statusbar_tag_message_cb (ParolePlugin *gst, const ParoleStream *stream, ParoleStatusbar *statusbar)
+{
+    ParoleState state;
+    
+    state = parole_plugin_get_state (statusbar->priv->plugin);
+    
+    parole_statusbar_set_text (statusbar, stream, state);
+}
+
+static void
+parole_statusbar_progressed_cb (ParolePlugin *gst, const ParoleStream *stream, 
+		 	        gdouble value, ParoleStatusbar *statusbar)
+{
+    ParoleState state;
+    
+    state = parole_plugin_get_state (statusbar->priv->plugin);
+    statusbar->priv->pos = value;
+    
+    parole_statusbar_set_duration (statusbar, state, value);
+}
+
+static void
+parole_statusbar_buffering_cb (ParolePlugin *gst, const ParoleStream *stream, gint percentage, ParoleStatusbar *statusbar)
+{
+    parole_statusbar_set_buffering (statusbar, percentage);
+    
+    if ( percentage == 100 )
+    {
+	gtk_widget_show (statusbar->priv->label_text);
+	gtk_widget_show (statusbar->priv->label_duration);
+	gtk_widget_hide (statusbar->priv->progress);
+    }
+}
+
+static void
 parole_statusbar_finalize (GObject *object)
 {
     ParoleStatusbar *statusbar;
 
     statusbar = PAROLE_STATUSBAR (object);
+    
+    g_object_unref (statusbar->priv->plugin);
 
     G_OBJECT_CLASS (parole_statusbar_parent_class)->finalize (object);
 }
@@ -71,10 +223,14 @@
 parole_statusbar_init (ParoleStatusbar *statusbar)
 {
     GtkWidget *box;
+    GtkWidget *sp;
     GtkBuilder *builder;
     
     statusbar->priv = PAROLE_STATUSBAR_GET_PRIVATE (statusbar);
+    statusbar->priv->plugin = parole_plugin_new (NULL, NULL, NULL);
+    
     statusbar->priv->duration = 0;
+    statusbar->priv->pos = 0;
     
     builder = parole_builder_get_main_interface ();
     
@@ -82,19 +238,47 @@
     
     statusbar->priv->progress = gtk_progress_bar_new ();
     gtk_widget_hide (statusbar->priv->progress);
-    statusbar->priv->label = gtk_label_new (NULL);
+    statusbar->priv->label_text = gtk_label_new (NULL);
 
-    gtk_misc_set_alignment (GTK_MISC (statusbar->priv->label), 0.0, 0.5);
+    gtk_misc_set_alignment (GTK_MISC (statusbar->priv->label_text), 0.0, 0.5);
+    
+    g_object_set (G_OBJECT (statusbar->priv->label_text), 
+		  "ellipsize", PANGO_ELLIPSIZE_END, 
+		  NULL);
 
     gtk_widget_set_size_request (statusbar->priv->progress, 180, 20);
 
-    gtk_box_pack_start (GTK_BOX (box), statusbar->priv->label, FALSE, FALSE, 0);
+    statusbar->priv->label_duration = gtk_label_new (NULL);
+    
+    sp = gtk_vseparator_new ();
+    gtk_widget_show (sp);
+    
+    gtk_box_pack_start (GTK_BOX (box), statusbar->priv->label_duration, FALSE, FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (box), sp, FALSE, FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (box), statusbar->priv->label_text, TRUE, TRUE, 0);
     gtk_box_pack_start (GTK_BOX (box), statusbar->priv->progress, FALSE, FALSE, 0);
 
     gtk_widget_show (box);
-    gtk_widget_show (statusbar->priv->label);
+    gtk_widget_show (statusbar->priv->label_text);
+    gtk_widget_show (statusbar->priv->label_duration);
     g_object_unref (builder);
     statusbar->priv->box = box;
+    
+    /*
+     * Gst signals
+     */
+    g_signal_connect (G_OBJECT (statusbar->priv->plugin), "state-changed",
+		      G_CALLBACK (parole_statusbar_state_changed_cb), statusbar);
+	
+    g_signal_connect (G_OBJECT (statusbar->priv->plugin), "progressed",
+		      G_CALLBACK (parole_statusbar_progressed_cb), statusbar);
+		      
+    g_signal_connect (G_OBJECT (statusbar->priv->plugin), "tag-message",
+		      G_CALLBACK (parole_statusbar_tag_message_cb), statusbar);
+    
+    g_signal_connect (G_OBJECT (statusbar->priv->plugin), "buffering",
+		      G_CALLBACK (parole_statusbar_buffering_cb), statusbar);
+    
 }
 
 ParoleStatusbar *
@@ -105,44 +289,6 @@
     return statusbar;
 }
 
-void parole_statusbar_set_text (ParoleStatusbar *bar, const gchar *text)
-{
-    gtk_label_set_text (GTK_LABEL (bar->priv->label), text);
-    gtk_widget_show (bar->priv->label);
-    gtk_widget_hide (bar->priv->progress);
-}
-
-void parole_statusbar_set_duration (ParoleStatusbar *bar, gdouble duration)
-{
-    bar->priv->duration = duration;
-}
-
-void parole_statusbar_set_position (ParoleStatusbar *bar, gboolean playing, gdouble position)
-{
-    gchar *text;
-
-    if ( bar->priv->duration != 0)
-	text = g_strdup_printf ("%s %4.2f/%4.2f", playing ? _("Playing") : ("Paused"), position, bar->priv->duration);
-    else
-	text = g_strdup_printf ("%s %4.2f", playing ? _("Playing") : ("Paused"), position);
-	
-    parole_statusbar_set_text (bar, text);
-    g_free (text);
-}
-
-void parole_statusbar_set_buffering (ParoleStatusbar *bar, gint percentage)
-{
-    gchar *buff;
-    
-    buff = g_strdup_printf ("%s %d%%", _("Buffering"), percentage);
-    
-    gtk_progress_bar_set_text (GTK_PROGRESS_BAR (bar->priv->progress), buff);
-    gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (bar->priv->progress), (gdouble) percentage/100);
-    gtk_widget_hide (bar->priv->label);
-    gtk_widget_show (bar->priv->progress);
-    g_free (buff);
-}
-
 void parole_statusbar_set_visible (ParoleStatusbar *bar, gboolean visible)
 {
     visible ? gtk_widget_show (bar->priv->box) : gtk_widget_hide (bar->priv->box);

Modified: parole/trunk/parole/parole-statusbar.h
===================================================================
--- parole/trunk/parole/parole-statusbar.h	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/parole/parole-statusbar.h	2009-07-28 07:57:58 UTC (rev 7853)
@@ -45,21 +45,9 @@
 } ParoleStatusbarClass;
 
 GType        			parole_statusbar_get_type        (void) G_GNUC_CONST;
+
 ParoleStatusbar       	       *parole_statusbar_new             (void);
 
-void				parole_statusbar_set_text	 (ParoleStatusbar *bar,
-								  const gchar *text);
-
-void				parole_statusbar_set_duration    (ParoleStatusbar *bar,
-								  gdouble duration);
-
-void				parole_statusbar_set_position    (ParoleStatusbar *bar,
-							          gboolean playing,
-							          gdouble position);
-							    
-void				parole_statusbar_set_buffering   (ParoleStatusbar *bar,
-								  gint percentage);
-
 void				parole_statusbar_set_visible 	 (ParoleStatusbar *bar,
 								  gboolean visible);
 

Modified: parole/trunk/plugins/tray/tray-icon.c
===================================================================
--- parole/trunk/plugins/tray/tray-icon.c	2009-07-27 21:27:25 UTC (rev 7852)
+++ parole/trunk/plugins/tray/tray-icon.c	2009-07-28 07:57:58 UTC (rev 7853)
@@ -193,6 +193,25 @@
 		  "live", &live,
 		  "media-type", &media_type,
 		  NULL);
+
+    if ( !title )
+    {
+	gchar *uri;
+	gchar *filename;
+	g_object_get (G_OBJECT (stream),
+		      "uri", &uri,
+		      NULL);
+		      
+	filename = g_filename_from_uri (uri, NULL, NULL);
+	g_free (uri);
+	if ( filename )
+	{
+	    title  = g_path_get_basename (filename);
+	    g_free (filename);
+	    if ( !title )
+		return;
+	}
+    }
     
     if ( live || media_type != PAROLE_MEDIA_TYPE_LOCAL_FILE )
     {




More information about the Goodies-commits mailing list