[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