[Goodies-commits] r7740 - in parole/trunk: . data/interfaces parole po

Ali Abdallah aliov at xfce.org
Sun Jul 19 01:08:55 CEST 2009


Author: aliov
Date: 2009-07-18 23:08:55 +0000 (Sat, 18 Jul 2009)
New Revision: 7740

Added:
   parole/trunk/parole/parole-disc.c
   parole/trunk/parole/parole-disc.h
Modified:
   parole/trunk/ChangeLog
   parole/trunk/TODO
   parole/trunk/data/interfaces/parole.ui
   parole/trunk/parole/Makefile.am
   parole/trunk/parole/main.c
   parole/trunk/parole/parole-dbus.c
   parole/trunk/parole/parole-gst.c
   parole/trunk/parole/parole-gst.h
   parole/trunk/parole/parole-player.c
   parole/trunk/parole/parole-stream.c
   parole/trunk/po/parole-media-player.pot
Log:
	* Parole now can play DVD/VCD.
	* parole/parole-stream.c no need to hold a reference to 
	ParoleMediaFile	object.
	* Change the flag of dbus_request_name to 
	DBUS_NAME_FLAG_ALLOW_REPLACEMENT to make the -i (new instance) 
	command line working and opening a new instance, such a way 
	if the old instance exists the new one will take the DBus name.

Modified: parole/trunk/ChangeLog
===================================================================
--- parole/trunk/ChangeLog	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/ChangeLog	2009-07-18 23:08:55 UTC (rev 7740)
@@ -1,3 +1,12 @@
+2009-07-19: 01:00  Ali aliov at xfce.org
+	* Parole now can play DVD/VCD.
+	* parole/parole-stream.c no need to hold a reference to 
+	ParoleMediaFile	object.
+	* Change the flag of dbus_request_name to 
+	DBUS_NAME_FLAG_ALLOW_REPLACEMENT to make the -i (new instance) 
+	command line working and opening a new instance, such a way 
+	if the old instance exists the new one will take the DBus name.
+
 2009-07-16: Ali aliov at xfce.org
         * Parole now has a simple plugin interface. (not yet complete).
 	* plugins/properties: media properties plugin (Read only,

Modified: parole/trunk/TODO
===================================================================
--- parole/trunk/TODO	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/TODO	2009-07-18 23:08:55 UTC (rev 7740)
@@ -1,12 +1,9 @@
 === Media player ===
-* Currenlty the media player doesn't play DVD/CD.
 * Complete the shortcut keys.
 * Handle playlist(s), save/load.
 * Better statusbar information.
 * Encoding support for subtitles.
 * Configure plugins dialog to load/unload plugins.
-* Generate the data from the interfaces files with
-  exo-csource to avoid having to install them.
 * ...
 
 === Plugins === 

Modified: parole/trunk/data/interfaces/parole.ui
===================================================================
--- parole/trunk/data/interfaces/parole.ui	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/data/interfaces/parole.ui	2009-07-18 23:08:55 UTC (rev 7740)
@@ -17,12 +17,12 @@
           <object class="GtkMenuBar" id="menubar">
             <property name="visible">True</property>
             <child>
-              <object class="GtkMenuItem" id="file-menu">
+              <object class="GtkMenuItem" id="media-menu-item">
                 <property name="visible">True</property>
                 <property name="label" translatable="yes">_Media</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
-                  <object class="GtkMenu" id="menu1">
+                  <object class="GtkMenu" id="media-menu">
                     <property name="visible">True</property>
                     <child>
                       <object class="GtkImageMenuItem" id="menu-open">

Modified: parole/trunk/parole/Makefile.am
===================================================================
--- parole/trunk/parole/Makefile.am	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/parole/Makefile.am	2009-07-18 23:08:55 UTC (rev 7740)
@@ -70,11 +70,12 @@
 	parole-conf-dialog.h			\
 	parole-rc-utils.h			\
 	parole-utils.h				\
+	parole-disc.h				\
 	parole-dbus.h				\
 	parole-medialist.h			\
 	parole-debug.h				\
 	parole-plugins-manager.h		\
-	parole-module.h
+	parole-module.h	
 
 libparole_headers =				\
 	$(INST_HFILES)
@@ -102,6 +103,7 @@
 	parole-screensaver.c			\
 	parole-conf.c				\
 	parole-conf-dialog.c			\
+	parole-disc.c				\
 	parole-rc-utils.c			\
 	parole-utils.c				\
 	parole-dbus.c				\

Modified: parole/trunk/parole/main.c
===================================================================
--- parole/trunk/parole/main.c	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/parole/main.c	2009-07-18 23:08:55 UTC (rev 7740)
@@ -129,7 +129,7 @@
         return EXIT_FAILURE;
     }
 
-    if ( parole_dbus_name_has_owner (PAROLE_DBUS_NAME) )
+    if ( !new_instance && parole_dbus_name_has_owner (PAROLE_DBUS_NAME) )
     {
 	TRACE ("Parole is already running");
 	if ( filenames && filenames[0] != NULL )

Modified: parole/trunk/parole/parole-dbus.c
===================================================================
--- parole/trunk/parole/parole-dbus.c	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/parole/parole-dbus.c	2009-07-18 23:08:55 UTC (rev 7740)
@@ -85,7 +85,7 @@
     ret =
         dbus_bus_request_name (parole_session_bus_get (),
                                name,
-                               DBUS_NAME_FLAG_DO_NOT_QUEUE,
+                               DBUS_NAME_FLAG_ALLOW_REPLACEMENT,
                                &error);
         
     if ( dbus_error_is_set (&error) )

Added: parole/trunk/parole/parole-disc.c
===================================================================
--- parole/trunk/parole/parole-disc.c	                        (rev 0)
+++ parole/trunk/parole/parole-disc.c	2009-07-18 23:08:55 UTC (rev 7740)
@@ -0,0 +1,307 @@
+/*
+ * * Copyright (C) 2009 Ali <aliov at xfce.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gio/gio.h>
+#include <gtk/gtk.h>
+
+#include <libxfce4util/libxfce4util.h>
+
+#include "common/parole-builder.h"
+
+#include "parole-disc.h"
+
+static void parole_disc_finalize   (GObject *object);
+
+#define PAROLE_DISC_GET_PRIVATE(o) \
+(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_DISC, ParoleDiscPrivate))
+
+struct ParoleDiscPrivate
+{
+    GVolumeMonitor *monitor;
+    GPtrArray      *array;
+    GtkWidget      *media_menu;
+    
+    gboolean	    needs_update;
+};
+
+enum
+{
+    DISC_SELECTED,
+    LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (ParoleDisc, parole_disc, G_TYPE_OBJECT)
+
+typedef struct
+{
+    GtkWidget      *mi;
+    gchar          *uri; /*Freed in (GDestroyNotify) in the data set below*/
+    ParoleDiscKind  kind;
+    
+} MountData;
+
+static void
+parole_disc_media_activate_cb (GtkWidget *widget, ParoleDisc *disc)
+{
+    gchar *uri ;
+    
+    uri = g_object_get_data (G_OBJECT (widget), "uri");
+    
+    g_signal_emit (G_OBJECT (disc), signals [DISC_SELECTED], 0, uri);
+}
+
+static void
+parole_disc_add_mount_to_menu (ParoleDisc *disc, GMount *mount)
+{
+    MountData *data;
+    GFile *file;
+    gchar **content_type;
+    guint i;
+    
+    file = g_mount_get_root (mount);
+    
+    data = g_new0 (MountData, 1);
+    data->kind = PAROLE_DISC_UNKNOWN;
+    
+    content_type = g_content_type_guess_for_tree (file);
+    
+    for ( i = 0; content_type && content_type[i]; i++)
+    {
+	if ( !g_strcmp0 (content_type[i], "x-content/video-dvd") )
+	{
+	    data->kind = PAROLE_DISC_DVD;
+	    data->uri = g_strdup ("dvd:/");
+	    break;
+	}
+	else if ( !g_strcmp0 (content_type[i], "x-content/video-vcd") )
+	{
+	    data->kind = PAROLE_DISC_VCD;
+	    data->uri = g_strdup ("vcd:/");
+	    break;
+	}
+	else if ( !g_strcmp0 (content_type[i], "x-content/video-svcd") )
+	{
+	    data->kind = PAROLE_DISC_SVCD;
+	    data->uri = g_strdup ("svcd:/");
+	    break;
+	}
+	else if ( !g_strcmp0 (content_type[i], "x-content/audio-cdda") )
+	{
+	    data->kind = PAROLE_DISC_CDDA;
+	    data->uri = g_strdup ("cdda:/");
+	    break;
+	}
+    }
+    
+    if ( content_type )
+	g_strfreev (content_type);
+	
+    if ( data->kind != PAROLE_DISC_UNKNOWN )
+    {
+	GtkWidget *img;
+	gchar *name;
+	gchar *label;
+	name = g_mount_get_name (mount);
+	label = g_strdup_printf ("%s %s", _("Play Disc"), name);
+	
+	data->mi = gtk_image_menu_item_new_with_label (label);
+	
+	img = gtk_image_new_from_stock (GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU);
+	gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (data->mi), 
+				       img);
+	gtk_widget_show (data->mi);
+	gtk_widget_show (img);
+	
+	g_object_set_data_full (G_OBJECT (data->mi),
+				"uri", data->uri,
+				(GDestroyNotify) g_free);
+	
+	gtk_menu_shell_insert (GTK_MENU_SHELL (disc->priv->media_menu), data->mi, 3);
+	g_signal_connect (data->mi, "activate",
+			  G_CALLBACK (parole_disc_media_activate_cb), disc);
+	g_free (label);
+	g_free (name);
+	g_ptr_array_add (disc->priv->array, data);
+    }
+    else
+	g_free (data);
+}
+
+static void
+parole_disc_add_drive (ParoleDisc *disc, GDrive *drive)
+{
+    GList *list;
+    guint len;
+    guint i;
+    
+    list = g_drive_get_volumes (drive);
+    len = g_list_length (list);
+    
+    for ( i = 0; i < len; i++)
+    {
+	GVolume *volume;
+	GMount *mount;
+	
+	volume = g_list_nth_data (list, i);
+	mount = g_volume_get_mount (volume);
+	if ( mount )
+	{
+	    parole_disc_add_mount_to_menu (disc, mount);
+	}
+    }
+    
+    g_list_foreach (list, (GFunc) g_object_unref, NULL);
+    g_list_free (list);
+}
+
+static void
+parole_disc_get_drives (ParoleDisc *disc)
+{
+    GList *list;
+    guint len;
+    guint i;
+    
+    list = g_volume_monitor_get_connected_drives (disc->priv->monitor);
+    
+    len = g_list_length (list);
+    
+    for ( i = 0; i < len; i++)
+    {
+	GDrive *drive;
+	drive = g_list_nth_data (list, i);
+	if ( g_drive_can_eject (drive) )
+	    parole_disc_add_drive (disc, drive);
+    }
+    
+    g_list_foreach (list, (GFunc) g_object_unref, NULL);
+    g_list_free (list);
+    disc->priv->needs_update = FALSE;
+}
+
+static void
+parole_disc_select_cb (GtkItem *item, ParoleDisc *disc)
+{
+    if ( disc->priv->needs_update )
+	parole_disc_get_drives (disc);
+}
+
+static void
+parole_disc_monitor_changed_cb (GVolumeMonitor *monitor, gpointer *device, ParoleDisc *disc)
+{
+    guint i;
+    
+    for ( i = 0 ; i < disc->priv->array->len; i++)
+    {
+	MountData *data;
+	
+	data = g_ptr_array_index (disc->priv->array, i);
+	gtk_widget_destroy (data->mi);
+	g_ptr_array_remove_index (disc->priv->array, i);
+	g_free (data);
+    }
+    
+    disc->priv->needs_update = TRUE;
+}
+
+static void
+parole_disc_class_init (ParoleDiscClass *klass)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    
+    signals[DISC_SELECTED] = 
+        g_signal_new ("disc-selected",
+                      PAROLE_TYPE_DISC,
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (ParoleDiscClass, disc_selected),
+                      NULL, NULL,
+		      g_cclosure_marshal_VOID__STRING,
+                      G_TYPE_NONE, 1, G_TYPE_STRING);
+		      
+    object_class->finalize = parole_disc_finalize;
+
+    g_type_class_add_private (klass, sizeof (ParoleDiscPrivate));
+}
+
+static void
+parole_disc_init (ParoleDisc *disc)
+{
+    GtkBuilder *builder;
+    
+    disc->priv = PAROLE_DISC_GET_PRIVATE (disc);
+    
+    builder = parole_builder_get_main_interface ();
+    
+    disc->priv->array = g_ptr_array_new ();
+    disc->priv->needs_update = TRUE;
+    
+    disc->priv->monitor = g_volume_monitor_get ();
+    
+    g_signal_connect (G_OBJECT (disc->priv->monitor), "volume-added",
+		      G_CALLBACK (parole_disc_monitor_changed_cb), disc);
+    
+    g_signal_connect (G_OBJECT (disc->priv->monitor), "volume-removed",
+		      G_CALLBACK (parole_disc_monitor_changed_cb), disc);
+    
+    g_signal_connect (G_OBJECT (disc->priv->monitor), "mount-added",
+		      G_CALLBACK (parole_disc_monitor_changed_cb), disc);
+		      
+    g_signal_connect (G_OBJECT (disc->priv->monitor), "mount-removed",
+		      G_CALLBACK (parole_disc_monitor_changed_cb), disc);
+    
+    disc->priv->media_menu = GTK_WIDGET (gtk_builder_get_object (builder, "media-menu"));
+    
+    g_signal_connect (gtk_builder_get_object (builder, "media-menu-item"), "select",
+	              G_CALLBACK (parole_disc_select_cb), disc);
+		      
+    g_object_unref (builder);
+}
+
+static void
+parole_disc_finalize (GObject *object)
+{
+    ParoleDisc *disc;
+
+    disc = PAROLE_DISC (object);
+    
+    g_object_unref (disc->priv->monitor);
+    
+    g_ptr_array_foreach (disc->priv->array, (GFunc) g_free, NULL);
+    g_ptr_array_free (disc->priv->array, TRUE);
+
+    G_OBJECT_CLASS (parole_disc_parent_class)->finalize (object);
+}
+
+ParoleDisc *
+parole_disc_new (void)
+{
+    ParoleDisc *disc = NULL;
+    disc = g_object_new (PAROLE_TYPE_DISC, NULL);
+    return disc;
+}

Added: parole/trunk/parole/parole-disc.h
===================================================================
--- parole/trunk/parole/parole-disc.h	                        (rev 0)
+++ parole/trunk/parole/parole-disc.h	2009-07-18 23:08:55 UTC (rev 7740)
@@ -0,0 +1,66 @@
+/*
+ * * Copyright (C) 2009 Ali <aliov at xfce.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef __PAROLE_DISC_H
+#define __PAROLE_DISC_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define PAROLE_TYPE_DISC        (parole_disc_get_type () )
+#define PAROLE_DISC(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_DISC, ParoleDisc))
+#define PAROLE_IS_DISC(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_DISC))
+
+typedef struct ParoleDiscPrivate ParoleDiscPrivate;
+
+typedef enum
+{
+    PAROLE_DISC_UNKNOWN,
+    PAROLE_DISC_CDDA,
+    PAROLE_DISC_VCD,
+    PAROLE_DISC_SVCD,
+    PAROLE_DISC_DVD
+    
+} ParoleDiscKind;
+
+typedef struct
+{
+    GObject         	   parent;
+    ParoleDiscPrivate     *priv;
+    
+} ParoleDisc;
+
+typedef struct
+{
+    GObjectClass 	   parent_class;
+    
+    void		   (*disc_selected)	       (ParoleDisc *disc,
+							const gchar *uri);
+    
+} ParoleDiscClass;
+
+GType                      parole_disc_get_type        (void) G_GNUC_CONST;
+
+ParoleDisc                *parole_disc_new             (void);
+
+G_END_DECLS
+
+#endif /* __PAROLE_DISC_H */

Modified: parole/trunk/parole/parole-gst.c
===================================================================
--- parole/trunk/parole/parole-gst.c	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/parole/parole-gst.c	2009-07-18 23:08:55 UTC (rev 7740)
@@ -30,6 +30,7 @@
 
 #include <gst/gst.h>
 #include <gst/interfaces/xoverlay.h>
+#include <gst/interfaces/navigation.h>
 
 #include <libxfce4util/libxfce4util.h>
 #include <libxfcegui4/libxfcegui4.h>
@@ -429,8 +430,7 @@
 static void
 parole_gst_load_subtitle (ParoleGst *gst)
 {
-    ParoleMediaFile *file;
-    const gchar *uri;
+    gchar *uri;
     gchar *sub;
     gchar *sub_uri;
     gboolean sub_enabled;
@@ -443,10 +443,9 @@
 	return;
 	
     g_object_get (G_OBJECT (gst->priv->stream),
-		  "media-file", &file,
+		  "uri", &uri,
 		  NULL);
 	
-    uri = parole_media_file_get_uri (file);
     sub = parole_get_subtitle_path (uri);
 
     if ( sub )
@@ -459,7 +458,7 @@
 	g_free (sub);
 	g_free (sub_uri);
     }
-    g_object_unref (file);
+    g_free (uri);
 }
 
 static void
@@ -797,7 +796,7 @@
 static void
 parole_gst_play_file_internal (ParoleGst *gst)
 {
-    ParoleMediaFile *file;
+    gchar *uri;
     
     TRACE ("Start");
     
@@ -807,18 +806,18 @@
     }
     
     g_object_get (G_OBJECT (gst->priv->stream),
-		  "media-file", &file,
+		  "uri", &uri,
 		  NULL);
     
     g_object_set (G_OBJECT (gst->priv->playbin),
-		  "uri", parole_media_file_get_uri (file),
+		  "uri", uri,
 		  "suburi", NULL,
 		  NULL);
 
     parole_gst_load_subtitle (gst);
 	    
     parole_gst_change_state (gst, GST_STATE_PLAYING);
-    g_object_unref (file);
+    g_free (uri);
 }
 
 static void
@@ -890,6 +889,60 @@
     return ret;
 }
 
+static gboolean
+parole_gst_button_press_event (GtkWidget *widget, GdkEventButton *ev)
+{
+    ParoleGst *gst;
+    GstNavigation *nav;
+    gboolean playing_video;
+    gboolean ret = FALSE;
+    
+    gst = PAROLE_GST (widget);
+    
+    g_object_get (G_OBJECT (gst->priv->stream),
+		  "has-video", &playing_video,
+		  NULL);
+    
+    if ( gst->priv->state == GST_STATE_PLAYING && playing_video)
+    {
+	nav = GST_NAVIGATION (gst->priv->video_sink);
+	gst_navigation_send_mouse_event (nav, "mouse-button-press", ev->button, ev->x, ev->y);
+	ret = TRUE;
+    }
+    
+    if (GTK_WIDGET_CLASS (parole_gst_parent_class)->button_press_event)
+	ret |= GTK_WIDGET_CLASS (parole_gst_parent_class)->button_press_event (widget, ev);
+
+    return ret;
+}
+
+static gboolean
+parole_gst_button_release_event (GtkWidget *widget, GdkEventButton *ev)
+{
+    ParoleGst *gst;
+    GstNavigation *nav;
+    gboolean playing_video;
+    gboolean ret = FALSE;
+    
+    gst = PAROLE_GST (widget);
+    
+    g_object_get (G_OBJECT (gst->priv->stream),
+		  "has-video", &playing_video,
+		  NULL);
+    
+    if ( gst->priv->state == GST_STATE_PLAYING && playing_video)
+    {
+	nav = GST_NAVIGATION (gst->priv->video_sink);
+	gst_navigation_send_mouse_event (nav, "mouse-button-release", ev->button, ev->x, ev->y);
+	ret = TRUE;
+    }
+    
+    if (GTK_WIDGET_CLASS (parole_gst_parent_class)->button_release_event)
+	ret |= GTK_WIDGET_CLASS (parole_gst_parent_class)->button_release_event (widget, ev);
+
+    return ret;
+}
+
 static void
 parole_gst_conf_notify_cb (GObject *object, GParamSpec *spec, ParoleGst *gst)
 {
@@ -915,6 +968,8 @@
     widget_class->size_allocate = parole_gst_size_allocate;
     widget_class->expose_event = parole_gst_expose_event;
     widget_class->motion_notify_event = parole_gst_motion_notify_event;
+    widget_class->button_press_event = parole_gst_button_press_event;
+    widget_class->button_release_event = parole_gst_button_release_event;
 
     signals[MEDIA_STATE] = 
         g_signal_new ("media-state",
@@ -1015,7 +1070,7 @@
     return GTK_WIDGET (parole_gst_object);
 }
 
-void parole_gst_play_file (ParoleGst *gst, ParoleMediaFile *file)
+void parole_gst_play_uri (ParoleGst *gst, const gchar *uri)
 {
     g_mutex_lock (gst->priv->lock);
     
@@ -1024,7 +1079,7 @@
     parole_stream_init_properties (gst->priv->stream);
     
     g_object_set (G_OBJECT (gst->priv->stream),
-	          "media-file", g_object_ref (file),
+	          "uri", uri,
 		  NULL);
 
     g_mutex_unlock (gst->priv->lock);

Modified: parole/trunk/parole/parole-gst.h
===================================================================
--- parole/trunk/parole/parole-gst.h	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/parole/parole-gst.h	2009-07-18 23:08:55 UTC (rev 7740)
@@ -25,7 +25,6 @@
 #include <gtk/gtk.h>
 
 #include "parole-stream.h"
-#include "parole-mediafile.h"
 
 G_BEGIN_DECLS
 
@@ -80,10 +79,11 @@
 } ParoleGstClass;
 
 GType        		parole_gst_get_type        (void) G_GNUC_CONST;
+
 GtkWidget      	       *parole_gst_new             (void);
 
-void		        parole_gst_play_file       (ParoleGst *gst,
-					            ParoleMediaFile *file);
+void		        parole_gst_play_uri        (ParoleGst *gst,
+					            const gchar *uri);
 
 void			parole_gst_pause           (ParoleGst *gst);
 

Modified: parole/trunk/parole/parole-player.c
===================================================================
--- parole/trunk/parole/parole-player.c	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/parole/parole-player.c	2009-07-18 23:08:55 UTC (rev 7740)
@@ -40,6 +40,7 @@
 #include "parole-gst.h"
 #include "parole-mediachooser.h"
 #include "parole-mediafile.h"
+#include "parole-disc.h"
 #include "parole-statusbar.h"
 #include "parole-screensaver.h"
 #include "parole-conf-dialog.h"
@@ -119,6 +120,7 @@
 {
     ParoleMediaList	*list;
     ParoleStatusbar     *status;
+    ParoleDisc          *disc;
     ParoleScreenSaver   *screen_saver;
     ParoleSidebar       *sidebar;
 
@@ -197,12 +199,8 @@
 }
 
 static void
-parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *row, ParolePlayer *player)
+parole_player_reset (ParolePlayer *player)
 {
-    ParoleMediaFile *file;
-    GtkTreeIter iter;
-    GtkTreeModel *model;
-
     parole_player_change_range_value (player, 0);
 
     if ( player->priv->row )
@@ -211,6 +209,16 @@
 	gtk_tree_row_reference_free (player->priv->row);
 	player->priv->row = NULL;
     }
+}
+
+static void
+parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *row, ParolePlayer *player)
+{
+    ParoleMediaFile *file;
+    GtkTreeIter iter;
+    GtkTreeModel *model;
+
+    parole_player_reset (player);
     
     player->priv->row = row;
     model = gtk_tree_row_reference_get_model (row);
@@ -223,13 +231,20 @@
 	{
 	    TRACE ("Trying to play media file %s", parole_media_file_get_uri (file));
 	    gtk_widget_set_sensitive (player->priv->stop, TRUE);
-	    parole_gst_play_file (PAROLE_GST (player->priv->gst), file);
+	    parole_gst_play_uri (PAROLE_GST (player->priv->gst), parole_media_file_get_uri (file));
 	    g_object_unref (file);
 	}
     }
 }
 
 static void
+parole_player_disc_selected_cb (ParoleDisc *disc, const gchar *uri, ParolePlayer *player)
+{
+    parole_player_reset (player);
+    parole_gst_play_uri (PAROLE_GST (player->priv->gst), uri);
+}
+
+static void
 parole_player_media_cursor_changed_cb (ParoleMediaList *list, gboolean media_selected, ParolePlayer *player)
 {
     if (!player->priv->state != PAROLE_MEDIA_STATE_PLAYING)
@@ -823,6 +838,7 @@
 
     g_object_unref (player->priv->gst);
     g_object_unref (player->priv->status);
+    g_object_unref (player->priv->disc);
     g_object_unref (player->priv->screen_saver);
     g_object_unref (player->priv->sidebar);
 
@@ -867,8 +883,13 @@
      * so we ref it to clean up the gst objects before quitting.
      */
     g_object_ref (player->priv->gst);
+    
     player->priv->sidebar = parole_sidebar_new ();
     player->priv->status = parole_statusbar_new ();
+    player->priv->disc = parole_disc_new ();
+    g_signal_connect (player->priv->disc, "disc-selected",
+		      G_CALLBACK (parole_player_disc_selected_cb), player);
+		      
     player->priv->screen_saver = parole_screen_saver_new ();
     player->priv->list = PAROLE_MEDIA_LIST (parole_media_list_new ());
     

Modified: parole/trunk/parole/parole-stream.c
===================================================================
--- parole/trunk/parole/parole-stream.c	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/parole/parole-stream.c	2009-07-18 23:08:55 UTC (rev 7740)
@@ -48,8 +48,7 @@
 struct _ParoleStreamPrivate
 {
     /*Properties*/
-    gpointer 	media_file;
-    
+    gchar      *uri;
     gboolean 	has_audio;
     gboolean    has_video;
     gboolean 	live;
@@ -67,7 +66,7 @@
 enum
 {
     PROP_0,
-    PROP_MEDIA_FILE,
+    PROP_URI,
     PROP_LIVE,
     PROP_HAS_AUDIO,
     PROP_HAS_VIDEO,
@@ -93,6 +92,9 @@
 
     switch (prop_id)
     {
+	case PROP_URI:
+	    PAROLE_STREAM_GET_PRIVATE (stream)->uri = g_value_dup_string (value);
+	    break;
 	case PROP_LIVE:
 	    PAROLE_STREAM_GET_PRIVATE (stream)->live = g_value_get_boolean (value);
 	    break;
@@ -102,9 +104,6 @@
 	case PROP_HAS_VIDEO:
 	    PAROLE_STREAM_GET_PRIVATE (stream)->has_video = g_value_get_boolean (value);
 	    break;
-	case PROP_MEDIA_FILE:
-	    PAROLE_STREAM_GET_PRIVATE (stream)->media_file = g_value_get_object (value);
-	    break;
 	case PROP_SEEKABLE:
 	    PAROLE_STREAM_GET_PRIVATE (stream)->seekable = g_value_get_boolean (value);
 	    break;
@@ -145,6 +144,9 @@
 
     switch (prop_id)
     {
+	case PROP_URI:
+	    g_value_set_string (value, PAROLE_STREAM_GET_PRIVATE (stream)->uri);
+	    break;
 	case PROP_LIVE:
 	    g_value_set_boolean (value, PAROLE_STREAM_GET_PRIVATE (stream)->live);
 	    break;
@@ -154,9 +156,6 @@
 	case PROP_HAS_VIDEO:
 	    g_value_set_boolean (value, PAROLE_STREAM_GET_PRIVATE (stream)->has_video);
 	    break;
-	case PROP_MEDIA_FILE:
-	    g_value_set_object (value, PAROLE_STREAM_GET_PRIVATE (stream)->media_file);
-	    break;
 	case PROP_SEEKABLE:
 	    g_value_set_boolean (value, PAROLE_STREAM_GET_PRIVATE (stream)->seekable);
 	    break;
@@ -191,14 +190,11 @@
 parole_stream_finalize (GObject *object)
 {
     ParoleStream *stream;
-    ParoleStreamPrivate *priv;
 
     stream = PAROLE_STREAM (object);
-    priv = PAROLE_STREAM_GET_PRIVATE (stream);
+    
+    parole_stream_init_properties (stream);
 
-    if ( priv->media_file )
-	g_object_unref (priv->media_file);
-
     G_OBJECT_CLASS (parole_stream_parent_class)->finalize (object);
 }
 
@@ -213,17 +209,17 @@
     object_class->set_property = parole_stream_set_property;
 
     /**
-     * ParoleStream:media-file:
+     * ParoleStream:uri:
      * 
-     * Currently playing #ParoleMediaFile.
+     * Currently loaded uri.
      * 
      * Since: 0.1 
      **/
     g_object_class_install_property (object_class,
-				     PROP_MEDIA_FILE,
-				     g_param_spec_object ("media-file",
+				     PROP_URI,
+				     g_param_spec_string ("uri",
 							  NULL, NULL,
-							  PAROLE_TYPE_MEDIA_FILE,
+							  NULL,
 							  G_PARAM_READWRITE));
     
     /**
@@ -389,10 +385,6 @@
 static void
 parole_stream_init (ParoleStream *stream)
 {
-    ParoleStreamPrivate *priv;
-    priv = PAROLE_STREAM_GET_PRIVATE (stream);
-
-    priv->media_file = NULL;
     parole_stream_init_properties (stream);
 }
 
@@ -409,6 +401,7 @@
     ParoleStreamPrivate *priv;
     
     priv = PAROLE_STREAM_GET_PRIVATE (stream);
+    
     priv->live = FALSE;
     priv->seekable = FALSE;
     priv->has_audio = FALSE;
@@ -416,14 +409,10 @@
     priv->absolute_duration = 0;
     priv->duration = 0;
     
-    if ( priv->media_file )
-	g_object_unref (priv->media_file);
-	
     PAROLE_STREAM_FREE_STR_PROP (priv->title);
+    PAROLE_STREAM_FREE_STR_PROP (priv->uri);
     PAROLE_STREAM_FREE_STR_PROP (priv->artist);
     PAROLE_STREAM_FREE_STR_PROP (priv->year);
     PAROLE_STREAM_FREE_STR_PROP (priv->album);
     PAROLE_STREAM_FREE_STR_PROP (priv->comment);
-	
-    priv->media_file = NULL;
 }

Modified: parole/trunk/po/parole-media-player.pot
===================================================================
--- parole/trunk/po/parole-media-player.pot	2009-07-17 23:15:44 UTC (rev 7739)
+++ parole/trunk/po/parole-media-player.pot	2009-07-18 23:08:55 UTC (rev 7740)
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-16 16:57+0200\n"
+"POT-Creation-Date: 2009-07-19 00:59+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -104,7 +104,7 @@
 msgid "gtk-help"
 msgstr ""
 
-#: ../data/desktop/parole.desktop.in.in.h:1 ../parole/parole-player.c:156
+#: ../data/desktop/parole.desktop.in.in.h:1 ../parole/parole-player.c:158
 msgid "Parole Media Player"
 msgstr ""
 
@@ -121,16 +121,16 @@
 msgid "Type '%s --help' for usage."
 msgstr ""
 
-#: ../parole/parole-gst.c:787
+#: ../parole/parole-gst.c:786
 msgid "Error in changing state to ready"
 msgstr ""
 
-#: ../parole/parole-gst.c:836
+#: ../parole/parole-gst.c:835
 msgid ""
 "Unable to load playbin GStreamer plugin, check your GStreamer installation"
 msgstr ""
 
-#: ../parole/parole-gst.c:851
+#: ../parole/parole-gst.c:850
 msgid ""
 "Unable to load video GStreamer plugin, check your GStreamer installation"
 msgstr ""
@@ -155,32 +155,32 @@
 msgid "Media list"
 msgstr ""
 
-#: ../parole/parole-player.c:177
+#: ../parole/parole-player.c:179
 msgid "Hide playlist"
 msgstr ""
 
-#: ../parole/parole-player.c:186
+#: ../parole/parole-player.c:188
 msgid "Show playlist"
 msgstr ""
 
-#: ../parole/parole-player.c:319 ../parole/parole-statusbar.c:126
-#: ../parole/parole-statusbar.c:128
+#: ../parole/parole-player.c:334 ../parole/parole-statusbar.c:131
+#: ../parole/parole-statusbar.c:133
 msgid "Playing"
 msgstr ""
 
-#: ../parole/parole-player.c:320
+#: ../parole/parole-player.c:335
 msgid "Media stream is not seekable"
 msgstr ""
 
-#: ../parole/parole-player.c:338 ../parole/parole-player.c:351
+#: ../parole/parole-player.c:353 ../parole/parole-player.c:366
 msgid "Paused"
 msgstr ""
 
-#: ../parole/parole-player.c:369
+#: ../parole/parole-player.c:384
 msgid "Stopped"
 msgstr ""
 
-#: ../parole/parole-player.c:931
+#: ../parole/parole-player.c:952
 msgid "Playlist"
 msgstr ""
 
@@ -197,7 +197,7 @@
 "</b>"
 msgstr ""
 
-#: ../parole/parole-statusbar.c:138
+#: ../parole/parole-statusbar.c:143
 msgid "Buffering"
 msgstr ""
 




More information about the Goodies-commits mailing list