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

Ali Abdallah aliov at xfce.org
Fri Jul 31 23:33:33 CEST 2009


Author: aliov
Date: 2009-07-31 21:33:33 +0000 (Fri, 31 Jul 2009)
New Revision: 7882

Modified:
   parole/trunk/ChangeLog
   parole/trunk/TODO
   parole/trunk/data/interfaces/mediachooser.ui
   parole/trunk/data/interfaces/parole-settings.ui
   parole/trunk/data/interfaces/parole.ui
   parole/trunk/data/interfaces/save-playlist.ui
   parole/trunk/parole/Makefile.am
   parole/trunk/parole/main.c
   parole/trunk/parole/parole-conf.c
   parole/trunk/parole/parole-disc-menu.c
   parole/trunk/parole/parole-disc-menu.h
   parole/trunk/parole/parole-disc.c
   parole/trunk/parole/parole-gst.c
   parole/trunk/parole/parole-gst.h
   parole/trunk/parole/parole-mediachooser.c
   parole/trunk/parole/parole-player.c
   parole/trunk/parole/parole-player.h
   parole/trunk/parole/parole-rc-utils.c
   parole/trunk/parole/parole-rc-utils.h
   parole/trunk/parole/parole-stream.c
   parole/trunk/parole/parole-stream.h
   parole/trunk/parole/parole-utils.c
   parole/trunk/po/parole-media-player.pot
Log:
	* Support for Recent played media files.
	* Better configuration loading based GValues.
	* Register posix signal handler.
	* Much better cdda support.
	* Patch the makefile by Enrico Tr?\195?\182ger to fix issue with 
	generating the enum types.
	* Fix the sound image menu items size.
	* Double clicks a file close the media chooser dialog.
	* Remove grey border in fullscreen mode.
	* Set the main window name to Parole Media Player.
	* Fix the expander packing style in the savelist chooser.
	

Modified: parole/trunk/ChangeLog
===================================================================
--- parole/trunk/ChangeLog	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/ChangeLog	2009-07-31 21:33:33 UTC (rev 7882)
@@ -1,3 +1,16 @@
+2009-07-31: 11:30 Ali aliov at xfce.org
+	* Support for Recent played media files.
+	* Better configuration loading based GValues.
+	* Register posix signal handler.
+	* Much better cdda support.
+	* Patch the makefile by Enrico Tröger to fix issue with 
+	generating the enum types.
+	* Fix the sound image menu items size.
+	* Double clicks a file close the media chooser dialog.
+	* Remove grey border in fullscreen mode.
+	* Set the main window name to Parole Media Player.
+	* Fix the expander packing style in the savelist chooser.
+	
 2009-07-30: Ali aliov at xfce.org
 	* Supports for Aspect ratio views.
 	* Remember the size of the main window set.

Modified: parole/trunk/TODO
===================================================================
--- parole/trunk/TODO	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/TODO	2009-07-31 21:33:33 UTC (rev 7882)
@@ -2,7 +2,6 @@
 * Complete the shortcut keys.
 * Handle missing gstreamer plugins.
 * Support scale ratio view.
-* Better support for cdda.
 * Support some playlist title entity.
 * Use pixel-aspect-ratio info when calculating the 
   aspect ratio.

Modified: parole/trunk/data/interfaces/mediachooser.ui
===================================================================
--- parole/trunk/data/interfaces/mediachooser.ui	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/data/interfaces/mediachooser.ui	2009-07-31 21:33:33 UTC (rev 7882)
@@ -12,6 +12,7 @@
         <property name="border_width">5</property>
         <property name="orientation">vertical</property>
         <property name="spacing">1</property>
+        <signal name="file_activated" handler="media_chooser_file_activate_cb"/>
         <signal name="current_folder_changed" handler="media_chooser_folder_changed_cb"/>
       </object>
       <packing>

Modified: parole/trunk/data/interfaces/parole-settings.ui
===================================================================
--- parole/trunk/data/interfaces/parole-settings.ui	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/data/interfaces/parole-settings.ui	2009-07-31 21:33:33 UTC (rev 7882)
@@ -22,86 +22,6 @@
             <property name="orientation">vertical</property>
             <property name="spacing">10</property>
             <child>
-              <object class="GtkFrame" id="frame1">
-                <property name="visible">True</property>
-                <property name="label_xalign">0</property>
-                <property name="shadow_type">none</property>
-                <child>
-                  <object class="GtkAlignment" id="alignment1">
-                    <property name="visible">True</property>
-                    <property name="left_padding">12</property>
-                    <child>
-                      <object class="GtkVBox" id="vbox2">
-                        <property name="visible">True</property>
-                        <property name="orientation">vertical</property>
-                        <property name="spacing">5</property>
-                        <child>
-                          <object class="GtkCheckButton" id="enable-vis">
-                            <property name="label" translatable="yes">Enable visualization when playing audio file</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="tooltip_text" translatable="yes">Changing this will take effect after parole is restarted or a new media file is loaded.</property>
-                            <property name="draw_indicator">True</property>
-                            <signal name="toggled" handler="parole_conf_dialog_enable_vis_changed_cb"/>
-                          </object>
-                          <packing>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkHBox" id="hbox1">
-                            <property name="visible">True</property>
-                            <property name="spacing">2</property>
-                            <child>
-                              <object class="GtkLabel" id="label4">
-                                <property name="visible">True</property>
-                                <property name="label" translatable="yes">Visualization type:</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkComboBox" id="vis-combobox">
-                                <property name="visible">True</property>
-                                <property name="model">liststore1</property>
-                                <signal name="changed" handler="parole_conf_dialog_vis_plugin_changed_cb"/>
-                                <child>
-                                  <object class="GtkCellRendererText" id="cellrenderertext1"/>
-                                  <attributes>
-                                    <attribute name="text">0</attribute>
-                                  </attributes>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                      </object>
-                    </child>
-                  </object>
-                </child>
-                <child type="label">
-                  <object class="GtkLabel" id="label1">
-                    <property name="visible">True</property>
-                    <property name="label" translatable="yes"><b>Audio</b></property>
-                    <property name="use_markup">True</property>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
               <object class="GtkFrame" id="frame-display">
                 <property name="visible">True</property>
                 <property name="label_xalign">0</property>
@@ -263,6 +183,85 @@
                 </child>
               </object>
               <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkFrame" id="frame1">
+                <property name="visible">True</property>
+                <property name="label_xalign">0</property>
+                <property name="shadow_type">none</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment1">
+                    <property name="visible">True</property>
+                    <property name="left_padding">12</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox2">
+                        <property name="visible">True</property>
+                        <property name="orientation">vertical</property>
+                        <property name="spacing">5</property>
+                        <child>
+                          <object class="GtkCheckButton" id="enable-vis">
+                            <property name="label" translatable="yes">Enable visualization when playing audio file</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="draw_indicator">True</property>
+                            <signal name="toggled" handler="parole_conf_dialog_enable_vis_changed_cb"/>
+                          </object>
+                          <packing>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkHBox" id="hbox1">
+                            <property name="visible">True</property>
+                            <property name="spacing">2</property>
+                            <child>
+                              <object class="GtkLabel" id="label4">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Visualization type:</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkComboBox" id="vis-combobox">
+                                <property name="visible">True</property>
+                                <property name="model">liststore1</property>
+                                <signal name="changed" handler="parole_conf_dialog_vis_plugin_changed_cb"/>
+                                <child>
+                                  <object class="GtkCellRendererText" id="cellrenderertext1"/>
+                                  <attributes>
+                                    <attribute name="text">0</attribute>
+                                  </attributes>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child type="label">
+                  <object class="GtkLabel" id="label1">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes"><b>Audio</b></property>
+                    <property name="use_markup">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
                 <property name="position">1</property>
               </packing>
             </child>
@@ -282,7 +281,7 @@
                         <property name="spacing">5</property>
                         <child>
                           <object class="GtkCheckButton" id="enable-subtitle">
-                            <property name="label" translatable="yes">Automatically load subtitle when playing movie file</property>
+                            <property name="label" translatable="yes">Automatically load subtitles when playing movie file</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="receives_default">False</property>

Modified: parole/trunk/data/interfaces/parole.ui
===================================================================
--- parole/trunk/data/interfaces/parole.ui	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/data/interfaces/parole.ui	2009-07-31 21:33:33 UTC (rev 7882)
@@ -3,6 +3,7 @@
   <requires lib="gtk+" version="2.16"/>
   <!-- interface-naming-policy project-wide -->
   <object class="GtkWindow" id="main-window">
+    <property name="title" translatable="yes">Parole Media Player</property>
     <property name="window_position">center</property>
     <property name="default_width">780</property>
     <property name="default_height">480</property>
@@ -219,7 +220,7 @@
                   <object class="GtkMenu" id="menu1">
                     <property name="visible">True</property>
                     <child>
-                      <object class="GtkImageMenuItem" id="imagemenuitem1">
+                      <object class="GtkImageMenuItem" id="volume-mute-menu">
                         <property name="label" translatable="yes">Mute</property>
                         <property name="visible">True</property>
                         <property name="image">image12</property>
@@ -227,7 +228,7 @@
                       </object>
                     </child>
                     <child>
-                      <object class="GtkImageMenuItem" id="imagemenuitem2">
+                      <object class="GtkImageMenuItem" id="volume-up-menu">
                         <property name="label" translatable="yes">Volume Up</property>
                         <property name="visible">True</property>
                         <property name="image">image11</property>
@@ -237,7 +238,7 @@
                       </object>
                     </child>
                     <child>
-                      <object class="GtkImageMenuItem" id="imagemenuitem3">
+                      <object class="GtkImageMenuItem" id="volume-down-menu">
                         <property name="label" translatable="yes">Volume Down</property>
                         <property name="visible">True</property>
                         <property name="image">image10</property>
@@ -286,6 +287,7 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="show_tabs">False</property>
+                <property name="show_border">False</property>
                 <property name="scrollable">True</property>
                 <property name="group_id">0</property>
                 <child>
@@ -378,14 +380,19 @@
                                           </packing>
                                         </child>
                                         <child>
-                                          <placeholder/>
+                                          <object class="GtkEventBox" id="eventboxinfo">
+                                            <property name="no_show_all">True</property>
+                                            <child>
+                                              <object class="GtkLabel" id="info">
+                                                <property name="no_show_all">True</property>
+                                                <property name="use_markup">True</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="position">4</property>
+                                          </packing>
                                         </child>
-                                        <child>
-                                          <placeholder/>
-                                        </child>
-                                        <child>
-                                          <placeholder/>
-                                        </child>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>

Modified: parole/trunk/data/interfaces/save-playlist.ui
===================================================================
--- parole/trunk/data/interfaces/save-playlist.ui	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/data/interfaces/save-playlist.ui	2009-07-31 21:33:33 UTC (rev 7882)
@@ -21,8 +21,6 @@
   </object>
   <object class="GtkFileChooserDialog" id="filechooserdialog">
     <property name="border_width">5</property>
-    <property name="default_width">480</property>
-    <property name="default_height">300</property>
     <property name="type_hint">normal</property>
     <property name="has_separator">False</property>
     <property name="action">save</property>
@@ -74,6 +72,8 @@
             </child>
           </object>
           <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
             <property name="position">2</property>
           </packing>
         </child>

Modified: parole/trunk/parole/Makefile.am
===================================================================
--- parole/trunk/parole/Makefile.am	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/Makefile.am	2009-07-31 21:33:33 UTC (rev 7882)
@@ -10,18 +10,11 @@
 	-DLOCALEDIR=\"$(localedir)\"		\
 	-DG_LOG_DOMAIN=\"parole\"		\
 	-DPAROLE_PLUGINS_DIR=\"$(libdir)/parole-$(PAROLE_VERSION_API)\"\
-	$(GTK_CFLAGS)                           \
-        $(GLIB_CFLAGS)                          \
-        $(GOBJECT_CFLAGS)                       \
         $(GTHREAD_CFLAGS)                       \
 	$(GIO_CFLAGS)				\
-        $(DBUS_CFLAGS)                          \
         $(DBUS_GLIB_CFLAGS)                     \
         $(LIBXFCE4GUI_CFLAGS)                   \
-        $(LIBXFCE4UTIL_CFLAGS)			\
-	$(GST_CFLAGS)				\
 	$(GST_VIDEO_CFLAGS)			\
-	$(GST_BASE_CFLAGS)			\
 	$(GST_INTERFACES_CFLAGS)
 
 PAROLE_LDFLAGS =				\
@@ -30,17 +23,10 @@
 	-export-symbols-regex "^[[^_]].*"
 
 PAROLE_LIBS = 					\
-	$(GTK_LIBS)                             \
-        $(GLIB_LIBS)                            \
-        $(GOBJECT_LIBS)                         \
         $(GTHREAD_LIBS)                         \
 	$(GIO_LIBS)				\
-        $(DBUS_LIBS)                            \
         $(DBUS_GLIB_LIBS)                       \
         $(LIBXFCE4GUI_LIBS)                     \
-        $(LIBXFCE4UTIL_LIBS)			\
-	$(GST_LIBS)				\
-	$(GST_BASE_LIBS)			\
 	$(GST_VIDEO_LIBS)			\
 	$(GST_INTERFACES_LIBS)
 
@@ -134,8 +120,7 @@
 	main.c
 
 parole_media_player_LDADD =			\
-	libparole.la				\
-	$(PAROLE_LIBS)
+	libparole.la
 
 parole_media_player_LDFLAGS =			\
 	$(PAROLE_LDFLAGS)
@@ -167,9 +152,9 @@
 		--fprod "/* enumerations from \"@filename@\" */\n" \
 		--vhead "GType @enum_name at _get_type (void);\n#define ENUM_GTYPE_ at ENUMSHORT@ (@enum_name at _get_type())\n" \
 		--ftail "G_END_DECLS\n\n#endif /* __ENUM_GTYPES_H__ */" \
-		$(parole_glib_enum_headers) ) > xgen-enum \
-	&& (cmp -s xgen-enum enum-gtypes.h || cp xgen-enum enum-gtypes.h) \
-	&& rm -f xgen-enum \
+		$(parole_glib_enum_headers) ) > xgen-enum.h \
+	&& (cmp -s xgen-enum.h enum-gtypes.h || cp xgen-enum.h enum-gtypes.h) \
+	&& rm -f xgen-enum.h \
 	&& echo timestamp > $(@F)
 
 enum-gtypes.c: $(parole_glib_enum_headers) Makefile
@@ -184,9 +169,9 @@
 		--vhead "GType\n at enum_name@_get_type (void)\n{\n  static GType etype = 0;\n  if (etype == 0) {\n    static const G at Type@Value values[] = {" \
 		--vprod "      { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
 		--vtail "      { 0, NULL, NULL }\n    };\n    etype = g_ at type@_register_static (\"@EnumName@\", values);\n  }\n  return etype;\n}\n" \
-		$(parole_glib_enum_headers) ) >> xgen-enum \
-	&& cp xgen-enum enum-gtypes.c \
-	&& rm -f xgen-enum
+		$(parole_glib_enum_headers) ) >> xgen-enum.c \
+	&& cp xgen-enum.c enum-gtypes.c \
+	&& rm -f xgen-enum.c
 
 org.parole.media.list.h: $(srcdir)/org.parole.media.list.xml
 	dbus-binding-tool --mode=glib-server --prefix=parole_media_list $< >$@

Modified: parole/trunk/parole/main.c
===================================================================
--- parole/trunk/parole/main.c	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/main.c	2009-07-31 21:33:33 UTC (rev 7882)
@@ -59,6 +59,14 @@
 }
 
 static void
+parole_sig_handler (gint sig, gpointer data)
+{
+    ParolePlayer *player = (ParolePlayer *) data;
+
+    parole_player_terminate (player);
+}
+
+static void
 parole_send_play_disc (DBusGProxy *proxy, const gchar *uri)
 {
     GError *error = NULL;
@@ -203,6 +211,27 @@
 		parole_media_list_add_files (list, filenames);
 	    }
 	}
+	
+	if ( xfce_posix_signal_handler_init (&error)) 
+	{
+	    xfce_posix_signal_handler_set_handler(SIGHUP,
+						  parole_sig_handler,
+						  player, NULL);
+
+	    xfce_posix_signal_handler_set_handler(SIGINT,
+						  parole_sig_handler,
+						  player, NULL);
+
+	    xfce_posix_signal_handler_set_handler(SIGTERM,
+						  parole_sig_handler,
+						  player, NULL);
+	} 
+	else 
+	{
+	    g_warning ("Unable to set up POSIX signal handlers: %s", error->message);
+	    g_error_free (error);
+	}
+
 	plugins = parole_plugins_manager_new ();
 	parole_plugins_manager_load_plugins (plugins);
 	g_object_unref (builder);

Modified: parole/trunk/parole/parole-conf.c
===================================================================
--- parole/trunk/parole/parole-conf.c	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-conf.c	2009-07-31 21:33:33 UTC (rev 7882)
@@ -37,22 +37,7 @@
 
 struct ParoleConfPrivate
 {
-    gchar 	*vis_sink;
-    gboolean 	 enable_vis;
-    gboolean	 enable_subtitle;
-    gchar	*subtitle_font;
-    gchar       *subtitle_encoding;
-    
-    gboolean     repeat;
-    gboolean     shuffle;
-    
-    gint         brightness;
-    gint         contrast;
-    gint         hue;
-    gint         saturation;
-    ParoleAspectRatio aspect_ratio;
-    gint 	 window_width;
-    gint	 window_height;
+    GValue      *values;
 };
 
 static gpointer parole_conf_object = NULL;
@@ -85,81 +70,43 @@
 				      GParamSpec *pspec)
 {
     ParoleConf *conf;
+    GValue *dst;
+    GValue save_dst = { 0, };
+     
     conf = PAROLE_CONF (object);
+   
+    dst = conf->priv->values + prop_id;
 
-    switch (prop_id)
+    if ( !G_IS_VALUE (dst) )
     {
-	case PROP_VIS_ENABLED:
-	    conf->priv->enable_vis = g_value_get_boolean (value);
-	    g_object_notify (G_OBJECT (conf), pspec->name);
-	    parole_rc_write_entry_bool ("VIS_ENABLED", PAROLE_RC_GROUP_GENERAL, conf->priv->enable_vis);
-	    break;
-	case PROP_SUBTITLE_ENCODING:
-	    if ( conf->priv->subtitle_encoding )
-		g_free (conf->priv->subtitle_encoding);
-	    conf->priv->subtitle_encoding = g_value_dup_string (value);
-	    parole_rc_write_entry_string ("SUBTITLE_ENCODING", PAROLE_RC_GROUP_GENERAL, conf->priv->subtitle_encoding);
-	    break;
-	case PROP_VIS_NAME:
-	    if ( conf->priv->vis_sink )
-		g_free (conf->priv->vis_sink);
-	    conf->priv->vis_sink = g_value_dup_string (value);
-	    parole_rc_write_entry_string ("VIS_NAME", PAROLE_RC_GROUP_GENERAL, conf->priv->vis_sink);
-	    break;
-	case PROP_SUBTITLE_ENABLED:
-	    conf->priv->enable_subtitle = g_value_get_boolean (value);
-	    parole_rc_write_entry_bool ("ENABLE_SUBTITLE", PAROLE_RC_GROUP_GENERAL, conf->priv->enable_subtitle);
-	    break;
-	case PROP_SUBTITLE_FONT:
-	    if ( conf->priv->subtitle_font )
-		g_free (conf->priv->subtitle_font);
-	    conf->priv->subtitle_font = g_value_dup_string (value);
-	    parole_rc_write_entry_string ("SUBTITLE_FONT", PAROLE_RC_GROUP_GENERAL, conf->priv->subtitle_font);
-	    break;
-	case PROP_REPEAT:
-	    conf->priv->repeat = g_value_get_boolean (value);
-	    parole_rc_write_entry_bool ("REPEAT", PAROLE_RC_GROUP_GENERAL, conf->priv->repeat);
-	    break;
-	case PROP_SHUFFLE:
-	    conf->priv->shuffle = g_value_get_boolean (value);
-	    parole_rc_write_entry_bool ("SHUFFLE", PAROLE_RC_GROUP_GENERAL, conf->priv->shuffle);
-	    break;
-	case PROP_SATURATION:
-	    conf->priv->saturation = g_value_get_int (value);
-	    parole_rc_write_entry_int ("SATURATION", PAROLE_RC_GROUP_GENERAL, conf->priv->saturation);
-	    break;
-	case PROP_HUE:
-	    conf->priv->hue = g_value_get_int (value);
-	    parole_rc_write_entry_int ("HUE", PAROLE_RC_GROUP_GENERAL, conf->priv->hue);
-	    break;
-	case PROP_CONTRAST:
-	    conf->priv->contrast = g_value_get_int (value);
-	    parole_rc_write_entry_int ("CONTRAST", PAROLE_RC_GROUP_GENERAL, conf->priv->contrast);
-	    break;
-	case PROP_BRIGHTNESS:
-	    conf->priv->brightness = g_value_get_int (value);
-	    parole_rc_write_entry_int ("BRIGHTNESS", PAROLE_RC_GROUP_GENERAL, conf->priv->brightness);
-	    break;
-	case PROP_ASPECT_RATIO:
-	    conf->priv->aspect_ratio = g_value_get_enum (value);
-	    parole_rc_write_entry_int ("ASPECT_RATIO", PAROLE_RC_GROUP_GENERAL, conf->priv->aspect_ratio);
-	    break;
-	case PROP_WINDOW_WIDTH:
-	    conf->priv->window_width = g_value_get_int (value);
-	    parole_rc_write_entry_int ("WINDOW_WIDTH", PAROLE_RC_GROUP_GENERAL, conf->priv->window_width);
-	    break;
-	case PROP_WINDOW_HEIGHT:
-	    conf->priv->window_height = g_value_get_int (value);
-	    parole_rc_write_entry_int ("WINDOW_HEIGHT", PAROLE_RC_GROUP_GENERAL, conf->priv->window_height);
-	    break;
-        default:
-            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-            goto out;
+	g_value_init (dst, pspec->value_type);
+	g_param_value_set_default (pspec, dst);
     }
-    g_object_notify (G_OBJECT (conf), pspec->name);
-    
-out:
-    ;
+
+    if ( g_param_values_cmp (pspec, value, dst) != 0 )
+    {
+	g_value_copy (value, dst);
+	g_object_notify (object, pspec->name);
+	
+	if ( pspec->value_type != G_TYPE_STRING )
+	{
+	    g_value_init (&save_dst, G_TYPE_STRING);
+		
+	    if ( G_LIKELY (g_value_transform (value, &save_dst)) )
+	    {
+		g_object_set_property (G_OBJECT (conf), pspec->name, &save_dst);
+		parole_rc_write_entry_string (pspec->name, PAROLE_RC_GROUP_GENERAL, g_value_get_string (&save_dst));
+	    }
+	    else
+		g_warning ("Unable to save property : %s", pspec->name);
+		
+	    g_value_unset (&save_dst);
+	}
+	else
+	{	
+	    parole_rc_write_entry_string (pspec->name, PAROLE_RC_GROUP_GENERAL, g_value_get_string (value));
+	}
+    }
 }
 
 static void parole_conf_get_property (GObject *object,
@@ -168,73 +115,75 @@
 				      GParamSpec *pspec)
 {
     ParoleConf *conf;
+    GValue *src;
+    
     conf = PAROLE_CONF (object);
-
-    switch (prop_id)
+    
+    src = conf->priv->values + prop_id;
+    
+    if (G_VALUE_HOLDS (src, pspec->value_type))
     {
-	case PROP_SUBTITLE_ENCODING:
-	    g_value_set_string (value, conf->priv->subtitle_encoding);
-	    break;
-	case PROP_VIS_ENABLED:
-	    g_value_set_boolean (value, conf->priv->enable_vis);
-	    break;
-	case PROP_VIS_NAME:
-	    g_value_set_string (value, conf->priv->vis_sink);
-	    break;
-	case PROP_SUBTITLE_ENABLED:
-	    g_value_set_boolean (value, conf->priv->enable_subtitle);
-	    break;
-	case PROP_SUBTITLE_FONT:
-	    g_value_set_string (value, conf->priv->subtitle_font);
-	    break;
-	case PROP_REPEAT:
-	    g_value_set_boolean (value, conf->priv->repeat);
-	    break;
-	case PROP_SHUFFLE:
-	    g_value_set_boolean (value, conf->priv->shuffle);
-	    break;
-	case PROP_SATURATION:
-	    g_value_set_int (value, conf->priv->saturation);
-	    break;
-	case PROP_HUE:
-	    g_value_set_int (value, conf->priv->hue);
-	    break;
-	case PROP_CONTRAST:
-	    g_value_set_int (value, conf->priv->contrast);
-	    break;
-	case PROP_BRIGHTNESS:
-	    g_value_set_int (value, conf->priv->brightness);
-	    break;
-	case PROP_ASPECT_RATIO:
-	    g_value_set_enum (value, conf->priv->aspect_ratio);
-	    break;
-	case PROP_WINDOW_WIDTH:
-	    g_value_set_int (value, conf->priv->window_width);
-	    break;
-	case PROP_WINDOW_HEIGHT:
-	    g_value_set_int (value, conf->priv->window_height);
-	    break;
-	default:
-            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-            break;
+	if (G_LIKELY (pspec->value_type == G_TYPE_STRING))
+	    g_value_set_static_string (value, g_value_get_string (src));
+	else
+	    g_value_copy (src, value);
     }
+    else
+    {
+	g_param_value_set_default (pspec, value);
+    }
 }
 
 static void
 parole_conf_finalize (GObject *object)
 {
     ParoleConf *conf;
+    guint i;
 
     conf = PAROLE_CONF (object);
     
-    g_free (conf->priv->vis_sink);
-    g_free (conf->priv->subtitle_font);
-    g_free (conf->priv->subtitle_encoding);
+    for ( i = 0; i < N_PROP; i++)
+    {
+        if ( G_IS_VALUE (conf->priv->values + i) )
+            g_value_unset (conf->priv->values + i);
+    }
+    
+    g_free (conf->priv->values);
 
     G_OBJECT_CLASS (parole_conf_parent_class)->finalize (object);
+    
 }
 
 static void
+transform_string_to_boolean (const GValue *src,
+                             GValue       *dst)
+{
+    g_value_set_boolean (dst, !g_strcmp0 (g_value_get_string (src), "TRUE"));
+}
+
+static void
+transform_string_to_int (const GValue *src,
+			 GValue       *dst)
+{
+    g_value_set_int (dst, strtol (g_value_get_string (src), NULL, 10));
+}
+
+static void
+transform_string_to_enum (const GValue *src,
+                          GValue       *dst)
+{
+    GEnumClass *genum_class;
+    GEnumValue *genum_value;
+
+    genum_class = g_type_class_peek (G_VALUE_TYPE (dst));
+    genum_value = g_enum_get_value_by_name (genum_class, g_value_get_string (src));
+    
+    if (G_UNLIKELY (genum_value == NULL))
+	genum_value = genum_class->values;
+    g_value_set_enum (dst, genum_value->value);
+}
+
+static void
 parole_conf_class_init (ParoleConfClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -244,6 +193,15 @@
     object_class->get_property = parole_conf_get_property;
     object_class->set_property = parole_conf_set_property;
 
+    if (!g_value_type_transformable (G_TYPE_STRING, G_TYPE_INT))
+	g_value_register_transform_func (G_TYPE_STRING, G_TYPE_INT, transform_string_to_int);
+
+    if (!g_value_type_transformable (G_TYPE_STRING, G_TYPE_BOOLEAN))
+	g_value_register_transform_func (G_TYPE_STRING, G_TYPE_BOOLEAN, transform_string_to_boolean);
+    
+    if (!g_value_type_transformable (G_TYPE_STRING, ENUM_GTYPE_ASPECT_RATIO))
+	g_value_register_transform_func (G_TYPE_STRING, ENUM_GTYPE_ASPECT_RATIO, transform_string_to_enum);
+	
     g_object_class_install_property (object_class,
                                      PROP_VIS_ENABLED,
                                      g_param_spec_boolean ("vis-enabled",
@@ -255,28 +213,28 @@
                                      PROP_VIS_NAME,
                                      g_param_spec_string  ("vis-name",
                                                            NULL, NULL,
-                                                           NULL,
+                                                           "none",
                                                            G_PARAM_READWRITE));
 
     g_object_class_install_property (object_class,
                                      PROP_SUBTITLE_ENCODING,
                                      g_param_spec_string  ("subtitle-encoding",
                                                            NULL, NULL,
-                                                           NULL,
+                                                           "UTF-8",
                                                            G_PARAM_READWRITE));
 
     g_object_class_install_property (object_class,
                                      PROP_SUBTITLE_ENABLED,
                                      g_param_spec_boolean ("enable-subtitle",
                                                            NULL, NULL,
-                                                           FALSE,
+                                                           TRUE,
                                                            G_PARAM_READWRITE));
 							   
     g_object_class_install_property (object_class,
                                      PROP_SUBTITLE_FONT,
                                      g_param_spec_string  ("subtitle-font",
                                                            NULL, NULL,
-                                                           NULL,
+                                                           "Sans 12",
                                                            G_PARAM_READWRITE));
     
     g_object_class_install_property (object_class,
@@ -358,24 +316,77 @@
 }
 
 static void
+parole_conf_load (ParoleConf *conf)
+{
+    XfceRc *rc;
+    const gchar *name;
+    const gchar *str;
+    GParamSpec  **pspecs, *pspec;
+    guint nspecs, i;
+    GValue src = { 0, }, dst = { 0, };
+    
+    rc = parole_get_resource_file (PAROLE_RC_GROUP_GENERAL, TRUE);
+    
+    if ( G_UNLIKELY (rc == NULL ) )
+    {
+	g_warning ("Unable to lookup rc file in : %s\n", PAROLE_RESOURCE_FILE);
+	return;
+    }
+
+    g_object_freeze_notify (G_OBJECT (conf));
+    
+    pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (conf), &nspecs);
+
+    g_value_init (&src, G_TYPE_STRING);
+    
+    for ( i = 0; i < nspecs; i++)
+    {
+	pspec = pspecs[i];
+	name = g_param_spec_get_name (pspec);
+	
+	str = xfce_rc_read_entry (rc, pspec->name, NULL);
+	
+	if ( str )
+	{
+	    g_value_set_static_string (&src, str);
+	    
+	    if ( pspec->value_type == G_TYPE_STRING )
+	    {
+		g_object_set_property (G_OBJECT (conf), name, &src);
+	    }
+	    else
+	    {
+		g_value_init (&dst, G_PARAM_SPEC_VALUE_TYPE (pspec));
+		
+		if ( G_LIKELY (g_value_transform (&src, &dst)))
+		{
+		    g_object_set_property (G_OBJECT (conf), name, &dst);
+		}
+		else
+		{
+		    g_warning ("Unable to load property %s", name);
+		}
+		    
+		g_value_unset (&dst);
+	    }
+	}
+    }
+    
+    xfce_rc_close (rc);
+    g_value_unset (&src);
+    g_object_thaw_notify (G_OBJECT (conf));
+    g_free (pspecs);
+}
+
+static void
 parole_conf_init (ParoleConf *conf)
 {
     conf->priv = PAROLE_CONF_GET_PRIVATE (conf);
     
-    conf->priv->enable_vis = parole_rc_read_entry_bool ("VIS_ENABLED", PAROLE_RC_GROUP_GENERAL, FALSE);
-    conf->priv->vis_sink   = g_strdup (parole_rc_read_entry_string ("VIS_NAME", PAROLE_RC_GROUP_GENERAL, "none"));
-    conf->priv->enable_subtitle = parole_rc_read_entry_bool ("ENABLE_SUBTITLE", PAROLE_RC_GROUP_GENERAL, TRUE);
-    conf->priv->subtitle_font = g_strdup (parole_rc_read_entry_string ("SUBTITLE_FONT", PAROLE_RC_GROUP_GENERAL, "Sans 12"));
-    conf->priv->subtitle_encoding = g_strdup (parole_rc_read_entry_string ("SUBTITLE_ENCODING", PAROLE_RC_GROUP_GENERAL, "UTF8"));
-    conf->priv->repeat = parole_rc_read_entry_bool ("REPEAT", PAROLE_RC_GROUP_GENERAL, FALSE);
-    conf->priv->shuffle = parole_rc_read_entry_bool ("SHUFFLE", PAROLE_RC_GROUP_GENERAL, FALSE);
-    conf->priv->saturation = parole_rc_read_entry_int ("SATURATION", PAROLE_RC_GROUP_GENERAL, 0);
-    conf->priv->hue = parole_rc_read_entry_int ("HUE", PAROLE_RC_GROUP_GENERAL, 0);
-    conf->priv->contrast = parole_rc_read_entry_int ("CONTRAST", PAROLE_RC_GROUP_GENERAL, 0);
-    conf->priv->brightness = parole_rc_read_entry_int ("BRIGHTNESS", PAROLE_RC_GROUP_GENERAL, 0);
-    conf->priv->aspect_ratio = parole_rc_read_entry_int ("ASPECT_RATIO", PAROLE_RC_GROUP_GENERAL, PAROLE_ASPECT_RATIO_NONE);
-    conf->priv->window_width = parole_rc_read_entry_int ("WINDOW_WIDTH", PAROLE_RC_GROUP_GENERAL, 780);
-    conf->priv->window_height = parole_rc_read_entry_int ("WINDOW_HEIGHT", PAROLE_RC_GROUP_GENERAL, 480);
+    conf->priv->values = g_new0 (GValue, N_PROP);
+    
+    parole_conf_load (conf);
+    
 }
 
 ParoleConf *

Modified: parole/trunk/parole/parole-disc-menu.c
===================================================================
--- parole/trunk/parole/parole-disc-menu.c	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-disc-menu.c	2009-07-31 21:33:33 UTC (rev 7882)
@@ -26,6 +26,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <libxfce4util/libxfce4util.h>
+
 #include "parole-disc-menu.h"
 #include "parole-builder.h"
 #include "parole-statusbar.h"
@@ -39,11 +41,13 @@
 struct ParoleDiscMenuPrivate
 {
     ParoleGst   *gst;
-    
+    ParoleMediaType current_media_type;
     GtkWidget	*next_chapter;
     GtkWidget	*prev_chapter;
     GtkWidget	*dvd_menu;
     GtkWidget	*chapter_menu;
+    GtkWidget	*info;
+    GtkWidget   *eventboxinfo;
 };
 
 G_DEFINE_TYPE (ParoleDiscMenu, parole_disc_menu, G_TYPE_OBJECT)
@@ -53,15 +57,23 @@
 {
     gtk_widget_hide (menu->priv->next_chapter);
     gtk_widget_hide (menu->priv->prev_chapter);
+    gtk_widget_hide (menu->priv->info);
+    gtk_widget_hide (menu->priv->eventboxinfo);
     //gtk_widget_hide (menu->priv->dvd_menu);
     //gtk_widget_hide (menu->priv->chapter_menu);
 }
 
 static void
-parole_disc_menu_show (ParoleDiscMenu *menu)
+parole_disc_menu_show (ParoleDiscMenu *menu, gboolean show_label)
 {
     gtk_widget_show (menu->priv->next_chapter);
     gtk_widget_show (menu->priv->prev_chapter);
+    
+    if ( show_label )
+    {
+	gtk_widget_show (menu->priv->eventboxinfo);
+	gtk_widget_show (menu->priv->info);
+    }
    //gtk_widget_show (menu->priv->dvd_menu);
    //gtk_widget_show (menu->priv->chapter_menu);
     
@@ -75,40 +87,71 @@
     
     if ( state < PAROLE_MEDIA_STATE_PAUSED )
     {
+	gtk_label_set_markup (GTK_LABEL (menu->priv->info), NULL);
 	parole_disc_menu_hide (menu);
     }
-    else
+    else if ( state == PAROLE_MEDIA_STATE_PLAYING )
     {
 	g_object_get (G_OBJECT (stream),
 		      "media-type", &media_type,
 		      NULL);
+	
 	if ( media_type == PAROLE_MEDIA_TYPE_DVD )
 	{
-	    parole_disc_menu_show (menu);
+	    gtk_button_set_label (GTK_BUTTON (menu->priv->next_chapter), _("Next Chapter"));
+	    gtk_button_set_label (GTK_BUTTON (menu->priv->prev_chapter), _("Previous Chapter"));
+	    parole_disc_menu_show (menu, FALSE);
 	}
+	else if ( media_type == PAROLE_MEDIA_TYPE_CDDA )
+	{
+	    guint num_tracks;
+	    guint current;
+	    gchar *text;
+	    gtk_button_set_label (GTK_BUTTON (menu->priv->next_chapter), _("Next Track"));
+	    gtk_button_set_label (GTK_BUTTON (menu->priv->prev_chapter), _("Previous Track"));
+	    
+	    g_object_get (G_OBJECT (stream),
+			  "num-tracks", &num_tracks,
+			  "track", &current,
+			  NULL);
+			  
+	    text = g_strdup_printf ("<span font_desc='sans 8' font_size='xx-large' color='#510DEC'>%s %i/%i</span>", _("Playing Track"), current, num_tracks);
+	    
+	    gtk_label_set_markup (GTK_LABEL (menu->priv->info), text);
+	    
+	    g_free (text);
+	    parole_disc_menu_show (menu, TRUE);
+	}
+	menu->priv->current_media_type = media_type;
     }
 }
 
 static void
-parole_disc_next_chapter_cb (ParoleDiscMenu *menu)
+parole_disc_menu_next_chapter_cb (ParoleDiscMenu *menu)
 {
-    parole_gst_next_dvd_chapter (menu->priv->gst);
+    if ( menu->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
+	parole_gst_next_dvd_chapter (menu->priv->gst);
+    else if ( menu->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA)
+	parole_gst_next_cdda_track (menu->priv->gst);
 }
 
 static void
-parole_disc_prev_chapter_cb (ParoleDiscMenu *menu)
+parole_disc_menu_prev_chapter_cb (ParoleDiscMenu *menu)
 {
-    parole_gst_prev_dvd_chapter (menu->priv->gst);
+    if ( menu->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
+	parole_gst_prev_dvd_chapter (menu->priv->gst);
+    else if ( menu->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA)
+	parole_gst_prev_cdda_track (menu->priv->gst);
 }
 
 static void
-parole_disc_dvd_menu_cb (ParoleDiscMenu *menu)
+parole_disc_menu_dvd_menu_cb (ParoleDiscMenu *menu)
 {
     
 }
 
 static void
-parole_disc_chapter_menu_cb (ParoleDiscMenu *menu)
+parole_disc_menu_chapter_menu_cb (ParoleDiscMenu *menu)
 {
     
 }
@@ -127,6 +170,8 @@
 parole_disc_menu_init (ParoleDiscMenu *menu)
 {
     GtkBuilder *builder;
+    GdkColor color;
+    
     menu->priv = PAROLE_DISC_MENU_GET_PRIVATE (menu);
     
     builder = parole_builder_get_main_interface ();
@@ -135,19 +180,25 @@
     menu->priv->prev_chapter = GTK_WIDGET (gtk_builder_get_object (builder, "prev-chapter"));
     menu->priv->chapter_menu = GTK_WIDGET (gtk_builder_get_object (builder, "chapter-menu"));
     menu->priv->dvd_menu = GTK_WIDGET (gtk_builder_get_object (builder, "dvd-menu"));
+    menu->priv->info = GTK_WIDGET (gtk_builder_get_object (builder, "info"));
+    menu->priv->eventboxinfo = GTK_WIDGET (gtk_builder_get_object (builder, "eventboxinfo"));
     
+    gdk_color_parse ("black", &color);
+    gtk_widget_modify_bg (menu->priv->eventboxinfo, GTK_STATE_NORMAL, &color);
+
+    menu->priv->current_media_type = PAROLE_MEDIA_TYPE_UNKNOWN;
     
     g_signal_connect_swapped (menu->priv->next_chapter, "clicked",
-			      G_CALLBACK (parole_disc_next_chapter_cb), menu);
+			      G_CALLBACK (parole_disc_menu_next_chapter_cb), menu);
     
     g_signal_connect_swapped (menu->priv->prev_chapter, "clicked",
-			      G_CALLBACK (parole_disc_prev_chapter_cb), menu);
+			      G_CALLBACK (parole_disc_menu_prev_chapter_cb), menu);
 			      
     g_signal_connect_swapped (menu->priv->dvd_menu, "clicked",
-			      G_CALLBACK (parole_disc_dvd_menu_cb), menu);
+			      G_CALLBACK (parole_disc_menu_dvd_menu_cb), menu);
     
     g_signal_connect_swapped (menu->priv->chapter_menu, "clicked",
-			      G_CALLBACK (parole_disc_chapter_menu_cb), menu);
+			      G_CALLBACK (parole_disc_menu_chapter_menu_cb), menu);
 			      
     menu->priv->gst = PAROLE_GST (parole_gst_new ());
     
@@ -179,3 +230,13 @@
 {
     return (GTK_WIDGET_VISIBLE (menu->priv->next_chapter));
 }
+
+void parole_disc_menu_seek_next (ParoleDiscMenu *menu)
+{
+    parole_disc_menu_next_chapter_cb (menu);
+}
+
+void parole_disc_menu_seek_prev (ParoleDiscMenu *menu)
+{
+    parole_disc_menu_prev_chapter_cb (menu);
+}

Modified: parole/trunk/parole/parole-disc-menu.h
===================================================================
--- parole/trunk/parole/parole-disc-menu.h	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-disc-menu.h	2009-07-31 21:33:33 UTC (rev 7882)
@@ -48,6 +48,10 @@
 
 gboolean			parole_disc_menu_visible	 (ParoleDiscMenu *menu);
 
+void				parole_disc_menu_seek_next	 (ParoleDiscMenu *menu);
+
+void				parole_disc_menu_seek_prev	 (ParoleDiscMenu *menu);
+
 G_END_DECLS
 
 #endif /* __PAROLE_DISC_MENU_H */

Modified: parole/trunk/parole/parole-disc.c
===================================================================
--- parole/trunk/parole/parole-disc.c	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-disc.c	2009-07-31 21:33:33 UTC (rev 7882)
@@ -76,81 +76,106 @@
     g_signal_emit (G_OBJECT (disc), signals [DISC_SELECTED], 0, uri);
 }
 
+static MountData *
+parole_disc_get_mount_data (ParoleDisc *disc, const gchar *label, const gchar *uri, ParoleDiscKind kind)
+{
+    MountData *data;
+    GtkWidget *img;
+    
+    data = g_new0 (MountData, 1);
+    data->kind = kind;
+    data->uri = g_strdup (uri);
+	
+    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, 2);
+    g_signal_connect (data->mi, "activate",
+		      G_CALLBACK (parole_disc_media_activate_cb), disc);
+    return data;
+}
+
 static void
 parole_disc_add_mount_to_menu (ParoleDisc *disc, GMount *mount)
 {
-    MountData *data;
     GFile *file;
     gchar **content_type;
     guint i;
+    ParoleDiscKind kind;
+    gchar *uri;
     
     file = g_mount_get_root (mount);
     
-    data = g_new0 (MountData, 1);
-    data->kind = PAROLE_DISC_UNKNOWN;
-    
+    if ( g_file_has_uri_scheme (file, "cdda") )
+    {
+	kind = PAROLE_DISC_CDDA;
+	uri = g_strdup ("cdda:/");
+	goto got_cdda;
+    }
+	
     content_type = g_content_type_guess_for_tree (file);
-    
+
     for ( i = 0; content_type && content_type[i]; i++)
     {
+	TRACE ("Checking disc content type : %s", content_type[i]);
+	    
 	if ( !g_strcmp0 (content_type[i], "x-content/video-dvd") )
 	{
-	    data->kind = PAROLE_DISC_DVD;
-	    data->uri = g_strdup ("dvd:/");
+	    kind = PAROLE_DISC_DVD;
+	    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:/");
+	    kind = PAROLE_DISC_VCD;
+	    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:/");
+	    kind = PAROLE_DISC_SVCD;
+	    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:/");
+	    kind = PAROLE_DISC_CDDA;
+	    uri = g_strdup ("cdda:/");
 	    break;
 	}
     }
     
     if ( content_type )
 	g_strfreev (content_type);
-	
-    if ( data->kind != PAROLE_DISC_UNKNOWN )
+
+got_cdda:
+    if ( kind != PAROLE_DISC_UNKNOWN )
     {
-	GtkWidget *img;
+	MountData *data;
 	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);
+	data = parole_disc_get_mount_data (disc, label, uri, kind);
+	g_free (uri);
 	
-	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, 2);
-	g_signal_connect (data->mi, "activate",
-			  G_CALLBACK (parole_disc_media_activate_cb), disc);
+	g_ptr_array_add (disc->priv->array, data);
 	g_free (label);
 	g_free (name);
-	g_ptr_array_add (disc->priv->array, data);
     }
-    else
-	g_free (data);
+    
+    g_object_unref (file);
 }
 
 static void
@@ -169,10 +194,14 @@
 	GMount *mount;
 	
 	volume = g_list_nth_data (list, i);
+	TRACE ("Volume name %s", g_volume_get_name (volume));
+	
 	mount = g_volume_get_mount (volume);
 	if ( mount )
 	{
+	    TRACE ("Mount name : %s", g_mount_get_name (mount));
 	    parole_disc_add_mount_to_menu (disc, mount);
+	    g_object_unref (mount);
 	}
     }
     
@@ -195,7 +224,8 @@
     {
 	GDrive *drive;
 	drive = g_list_nth_data (list, i);
-	if ( g_drive_can_eject (drive) )
+	
+	if ( g_drive_can_eject (drive) && g_drive_has_media (drive) )
 	    parole_disc_add_drive (disc, drive);
     }
     

Modified: parole/trunk/parole/parole-gst.c
===================================================================
--- parole/trunk/parole/parole-gst.c	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-gst.c	2009-07-31 21:33:33 UTC (rev 7882)
@@ -52,8 +52,13 @@
 (G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_GST, ParoleGstPrivate))
 
 static void	parole_gst_play_file_internal 	(ParoleGst *gst);
+
 static void     parole_gst_change_state 	(ParoleGst *gst, 
 						 GstState new);
+						 
+static void     parole_gst_seek_cdda_track	(ParoleGst *gst,
+						 gint track) G_GNUC_UNUSED;
+
 struct ParoleGstPrivate
 {
     GstElement	 *playbin;
@@ -116,12 +121,11 @@
     g_object_unref (gst->priv->stream);
     g_object_unref (gst->priv->playbin);
     g_object_unref (gst->priv->bus);
- 
+    g_object_unref (gst->priv->conf);
     g_object_unref (gst->priv->logo);
+    
     g_mutex_free (gst->priv->lock);
 
-    g_object_unref (gst->priv->conf);
-
     G_OBJECT_CLASS (parole_gst_parent_class)->finalize (object);
 }
 
@@ -561,14 +565,47 @@
 }
 
 static void
+parole_gst_query_cdda_tracks (ParoleGst *gst)
+{
+    GstFormat format;
+    gint64 duration;
+    gint tracks;
+    
+    format = gst_format_get_by_nick ("track");
+    
+    if ( format != GST_FORMAT_UNDEFINED )
+    {
+	gst_element_query_duration (gst->priv->playbin, &format, &duration);
+	
+	tracks = (gint) duration;
+	
+	TRACE ("CDDA source has %d tacks", tracks);
+	
+	g_object_set (G_OBJECT (gst->priv->stream),
+		      "num-tracks", tracks,
+		      NULL);
+    }
+}
+
+static void
 parole_gst_query_duration (ParoleGst *gst)
 {
+    ParoleMediaType media_type;
     gint64 absolute_duration = 0;
     gdouble duration = 0;
     gboolean live;
     
-    GstFormat gst_time = GST_FORMAT_TIME;
+    GstFormat gst_time;
     
+    g_object_get (G_OBJECT (gst->priv->stream),
+		  "media-type", &media_type,
+		  NULL);
+    
+    if ( media_type == PAROLE_MEDIA_TYPE_CDDA )
+	parole_gst_query_cdda_tracks (gst);
+    
+    gst_time = GST_FORMAT_TIME;
+    
     gst_element_query_duration (gst->priv->playbin, 
 				&gst_time,
 				&absolute_duration);
@@ -577,7 +614,9 @@
     {
 	duration =  absolute_duration / ((gdouble) 60 * 1000 * 1000 * 1000);
 	live = ( absolute_duration == 0 );
+	
 	TRACE ("Duration %e is_live=%d", duration, live);
+	
 	g_object_set (G_OBJECT (gst->priv->stream),
 		      "absolute-duration", absolute_duration,
 		      "duration", duration,
@@ -817,7 +856,7 @@
 parole_gst_evaluate_state (ParoleGst *gst, GstState old, GstState new, GstState pending)
 {
     TRACE ("State change new %i old %i pending %i", new, old, pending);
-
+    
     gst->priv->state = new;
 
     parole_gst_tick (gst);
@@ -828,10 +867,12 @@
     switch (gst->priv->state)
     {
 	case GST_STATE_PLAYING:
+	{
 	    gst->priv->media_state = PAROLE_MEDIA_STATE_PLAYING;
 	    g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0, 
 			   gst->priv->stream, PAROLE_MEDIA_STATE_PLAYING);
 	    break;
+	}
 	case GST_STATE_PAUSED:
 	    if ( old == GST_STATE_READY )
 	    {
@@ -839,8 +880,11 @@
 		parole_gst_query_capabilities (gst);
 		parole_gst_query_info (gst);
 	    }
-	    if ( gst->priv->update_color_balance && gst->priv->target == GST_STATE_PLAYING )
-		parole_gst_set_video_color_balance (gst);
+	    if ( gst->priv->target == GST_STATE_PLAYING )
+	    {
+		if ( gst->priv->update_color_balance )
+		    parole_gst_set_video_color_balance (gst);
+	    }
 		
 	    gst->priv->media_state = PAROLE_MEDIA_STATE_PAUSED;
 	    g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0, 
@@ -891,8 +935,26 @@
 }
 
 static void
-parole_gst_get_meta_data (ParoleGst *gst, GstTagList *tag)
+parole_gst_get_meta_data_cdda (ParoleGst *gst, GstTagList *tag)
 {
+    guint num_tracks;
+    guint track;
+    
+    if (gst_tag_list_get_uint (tag, GST_TAG_TRACK_NUMBER, &track) &&
+	gst_tag_list_get_uint (tag, GST_TAG_TRACK_COUNT, &num_tracks))
+    {
+	g_object_set (G_OBJECT (gst->priv->stream),
+		      "num-tracks", num_tracks,
+		      "track", track,
+		      NULL);
+	TRACE ("num_tracks=%i track=%i", num_tracks, track);
+	g_signal_emit (G_OBJECT (gst), signals [MEDIA_TAG], 0, gst->priv->stream);
+    }
+}
+
+static void
+parole_gst_get_meta_data_local_file (ParoleGst *gst, GstTagList *tag)
+{
     gchar *str;
     GDate *date;
     
@@ -950,9 +1012,32 @@
 		  NULL);
 		  
     g_signal_emit (G_OBJECT (gst), signals [MEDIA_TAG], 0, gst->priv->stream);
+    
 }
 
 static void
+parole_gst_get_meta_data (ParoleGst *gst, GstTagList *tag)
+{
+    ParoleMediaType media_type;
+    
+    g_object_get (G_OBJECT (gst->priv->stream),
+		  "media-type", &media_type,
+		  NULL);
+    
+    switch ( media_type )
+    {
+	case PAROLE_MEDIA_TYPE_LOCAL_FILE:
+	    parole_gst_get_meta_data_local_file (gst, tag);
+	    break;
+	case PAROLE_MEDIA_TYPE_CDDA:
+	    parole_gst_get_meta_data_cdda (gst, tag);
+	    break;
+	default:
+	    break;
+    }
+}
+
+static void
 parole_gst_application_message (ParoleGst *gst, GstMessage *msg)
 {
     const gchar *name;
@@ -984,11 +1069,36 @@
     switch (GST_MESSAGE_TYPE (msg))
     {
         case GST_MESSAGE_EOS:
+	{
+	    ParoleMediaType media_type;
+	    gint current_track;
+	    
 	    TRACE ("End of stream");
+	    
+	    g_object_get (G_OBJECT (gst->priv->stream),
+			  "media-type", &media_type,
+			  NULL);
+	    if ( media_type == PAROLE_MEDIA_TYPE_CDDA )
+	    {
+		gint num_tracks;
+		g_object_get (G_OBJECT (gst->priv->stream),
+			      "num-tracks", &num_tracks,
+			      "track", &current_track,
+			      NULL);
+			  
+		TRACE ("------------------Current track %d Number of tracks %d", current_track, num_tracks);
+		if ( num_tracks != current_track )
+		{
+		    parole_gst_seek_cdda_track (gst, current_track);
+		    break;
+		}
+	    }
+		
 	    gst->priv->media_state = PAROLE_MEDIA_STATE_FINISHED;
 	    g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0, 
 			       gst->priv->stream, PAROLE_MEDIA_STATE_FINISHED);
 	    break;
+	}
 	case GST_MESSAGE_ERROR:
 	{
 	    GError *error = NULL;
@@ -1286,30 +1396,73 @@
     return ret;
 }
 
+static void     parole_gst_seek_cdda_track	(ParoleGst *gst,
+						 gint track)
+{
+    TRACE ("Track %d", track);
+    
+    if ( !gst_element_seek (gst->priv->playbin, 1.0, gst_format_get_by_nick ("track"), 
+			    GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 
+			    track,
+			    GST_SEEK_TYPE_NONE,
+			    0) )
+	g_warning ("Seek to track %d failed ", track);
+}
+
 static void
-parole_gst_change_dvd_chapter (ParoleGst *gst, gint level)
+parole_gst_seek_by_format (ParoleGst *gst, GstFormat format, gint step)
 {
-    GstFormat format;
-    gint64 val;
+    gint64 val = 1;
     
-    format = gst_format_get_by_nick ("chapter");
-    
-    if ( format != GST_FORMAT_UNDEFINED )
+    if ( gst_element_query_position (gst->priv->playbin, &format, &val) )
     {
-	if ( gst_element_query_position (gst->priv->playbin, &format, &val) )
+	val += step;
+	if ( !gst_element_seek (gst->priv->playbin, 1.0, format, 
+				GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 
+			        val,
+			        GST_SEEK_TYPE_NONE,
+			        0) )
 	{
-	    val += level;
-	    gst_element_seek (gst->priv->playbin, 1.0, format, 
-			      GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 
-			      val,
-			      GST_SEEK_TYPE_NONE,
-			      0);
+	    g_warning ("Seek failed : %s", gst_format_get_name (format));
 	}
     }
+    else
+    {
+	g_warning ("Failed to query element position: %s", gst_format_get_name (format));
+    }
+}
+
+static void
+parole_gst_change_dvd_chapter (ParoleGst *gst, gint level)
+{
+    GstFormat format;
+
+    // FIXME: Do we really need to get the nich each time?
+    format = gst_format_get_by_nick ("chapter");
     
+    parole_gst_seek_by_format (gst, format, level);
 }
 
 static void
+parole_gst_change_cdda_track (ParoleGst *gst, gint level)
+{
+    GstFormat format;
+    
+    format = gst_format_get_by_nick ("track");
+    
+    parole_gst_seek_by_format (gst, format, level);
+}
+
+ParoleMediaType	parole_gst_get_current_stream_type (ParoleGst *gst)
+{
+    ParoleMediaType type;
+    g_object_get (G_OBJECT (gst->priv->stream),
+		  "media-type", &type,
+		  NULL);
+    return type;
+}
+
+static void
 parole_gst_conf_notify_cb (GObject *object, GParamSpec *spec, ParoleGst *gst)
 {
     if ( !g_strcmp0 ("vis-enabled", spec->name) || !g_strcmp0 ("vis-name", spec->name) )
@@ -1560,7 +1713,6 @@
 	    }
 	}
     }
-    
     parole_gst_change_state (gst, GST_STATE_NULL);
 }
 
@@ -1643,6 +1795,33 @@
     parole_gst_change_dvd_chapter (gst, -1);
 }
 
+void parole_gst_next_cdda_track (ParoleGst *gst)
+{
+    parole_gst_change_cdda_track (gst, 1);
+}
+
+void parole_gst_prev_cdda_track (ParoleGst *gst)
+{
+    parole_gst_change_cdda_track (gst, -1);
+}
+
+gint parole_gst_get_current_cdda_track (ParoleGst *gst)
+{
+    GstFormat format;
+    gint64 pos;
+    gint ret_val = 1;
+    
+    format = gst_format_get_by_nick ("track");
+    
+    if ( gst_element_query_position (gst->priv->playbin, &format, &pos) )
+    {
+	TRACE ("Pos %lld", pos);
+	ret_val = (gint) pos;
+    }
+	
+    return ret_val;
+}
+
 gdouble	parole_gst_get_stream_duration (ParoleGst *gst)
 {
     gdouble dur;

Modified: parole/trunk/parole/parole-gst.h
===================================================================
--- parole/trunk/parole/parole-gst.h	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-gst.h	2009-07-31 21:33:33 UTC (rev 7882)
@@ -112,6 +112,14 @@
 
 void			parole_gst_prev_dvd_chapter 	(ParoleGst *gst);
 
+void			parole_gst_next_cdda_track 	(ParoleGst *gst);
+
+void			parole_gst_prev_cdda_track 	(ParoleGst *gst);
+
+gint			parole_gst_get_current_cdda_track (ParoleGst *gst);
+
+ParoleMediaType		parole_gst_get_current_stream_type (ParoleGst *gst);
+
 gdouble			parole_gst_get_stream_duration	(ParoleGst *gst);
 
 gdouble			parole_gst_get_stream_position  (ParoleGst *gst);

Modified: parole/trunk/parole/parole-mediachooser.c
===================================================================
--- parole/trunk/parole/parole-mediachooser.c	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-mediachooser.c	2009-07-31 21:33:33 UTC (rev 7882)
@@ -53,6 +53,9 @@
 void	media_chooser_folder_changed_cb (GtkWidget *widget, 
 					 gpointer data);
 
+void	media_chooser_file_activate_cb  (GtkFileChooser *filechooser,
+					 ParoleMediaChooser *chooser);
+
 enum
 {
     MEDIA_FILES_OPENED,
@@ -123,6 +126,11 @@
     gtk_widget_destroy (GTK_WIDGET (chooser));
 }
 
+void media_chooser_file_activate_cb (GtkFileChooser *filechooser, ParoleMediaChooser *chooser)
+{
+    parole_media_chooser_open (NULL, chooser);
+}
+
 static void
 parole_media_chooser_open_internal (GtkWidget *chooser)
 {

Modified: parole/trunk/parole/parole-player.c
===================================================================
--- parole/trunk/parole/parole-player.c	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-player.c	2009-07-31 21:33:33 UTC (rev 7882)
@@ -173,6 +173,8 @@
     ParoleConf          *conf;
     ParoleDiscMenu      *disc_menu;
     ParoleSession       *session;
+    
+    GtkRecentManager    *recent;
 
     GtkWidget 		*gst;
 
@@ -295,11 +297,14 @@
 static void
 parole_player_change_range_value (ParolePlayer *player, gdouble value)
 {
-    player->priv->internal_range_change = TRUE;
+    if ( !player->priv->user_seeking )
+    {
+	player->priv->internal_range_change = TRUE;
     
-    gtk_range_set_value (GTK_RANGE (player->priv->range), value);
+	gtk_range_set_value (GTK_RANGE (player->priv->range), value);
 
-    player->priv->internal_range_change = FALSE;
+	player->priv->internal_range_change = FALSE;
+    }
 }
 
 static void
@@ -417,19 +422,23 @@
     gboolean save = TRUE;
     gchar **lines = NULL;
     guint i;
+
+    g_object_get (G_OBJECT (stream),
+		  "uri", &uri,
+		  NULL);
     
     g_object_get (G_OBJECT (stream),
 		  "media-type", &media_type,
 		  NULL);
 		  
     if ( media_type == PAROLE_MEDIA_TYPE_LOCAL_FILE )
-	return;
+    {
+	gtk_recent_manager_add_item (player->priv->recent, uri);
+	goto out;
+    }
 	
     lines = parole_get_history ();
     
-    g_object_get (G_OBJECT (stream),
-		  "uri", &uri,
-		  NULL);
     if (lines )
     {
 	for ( i = 0; lines[i]; i++)
@@ -448,6 +457,7 @@
     }
     
     g_strfreev (lines);
+out:
     g_free (uri);
 }
 
@@ -480,9 +490,11 @@
     
     if ( seekable )
     {
+	player->priv->internal_range_change = TRUE;
 	gtk_range_set_range (GTK_RANGE (player->priv->range), 0, duration);
 	gtk_widget_set_sensitive (player->priv->seekf, TRUE);
 	gtk_widget_set_sensitive (player->priv->seekb, TRUE);
+	player->priv->internal_range_change = FALSE;
     }
     else
     {
@@ -747,6 +759,7 @@
     {
 	value = gtk_range_get_value (GTK_RANGE (range));
 	player->priv->user_seeking = TRUE;
+	TRACE ("Sending a seek request with value :%e", value);
 	parole_gst_seek (PAROLE_GST (player->priv->gst), value);
 	player->priv->user_seeking = FALSE;
     }
@@ -825,13 +838,13 @@
 static void
 parole_player_next_menu_item_activate (ParolePlayer *player)
 {
-    parole_gst_next_dvd_chapter (PAROLE_GST (player->priv->gst));
+    parole_disc_menu_seek_next (player->priv->disc_menu);
 }
 
 static void
 parole_player_previous_menu_item_activate (ParolePlayer *player)
 {
-    parole_gst_prev_dvd_chapter (PAROLE_GST (player->priv->gst));
+    parole_disc_menu_seek_prev (player->priv->disc_menu);
 }
 
 static void
@@ -915,9 +928,12 @@
     GtkWidget *menu, *mi, *img;
     gboolean sensitive;
     gboolean dvd_menu;
+    ParoleMediaType media_type;
     
     dvd_menu = parole_disc_menu_visible (player->priv->disc_menu);
     
+    media_type = parole_gst_get_current_stream_type (PAROLE_GST (player->priv->gst));
+    
     menu = gtk_menu_new ();
     
     /*Play menu item
@@ -936,7 +952,8 @@
 			      G_CALLBACK (parole_player_play_menu_item_activate), player);
     gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
     
-    /*Seek Forward.
+    /*
+     * Seek Forward.
      */
     mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_FORWARD, NULL);
 					     
@@ -946,7 +963,8 @@
 		      G_CALLBACK (parole_player_seekf_cb), player);
     gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
     
-    /*Seek backward.
+    /*
+     * Seek backward.
      */
     mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_REWIND, NULL);
 					     
@@ -956,7 +974,8 @@
 		      G_CALLBACK (parole_player_seekb_cb), player);
     gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
     
-    /*Stop menu item
+    /*
+     * Stop menu item
      */
     mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_STOP, NULL);
 					     
@@ -966,9 +985,10 @@
 			      G_CALLBACK (parole_player_stop_menu_item_activate), player);
     gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
     
-    /*Next chapter menu item
+    /*
+     * Next chapter menu item
      */
-    mi = gtk_image_menu_item_new_with_label (_("Next Chapter"));
+    mi = gtk_image_menu_item_new_with_label (media_type == PAROLE_MEDIA_TYPE_CDDA ? _("Next Track") : _("Next Chapter"));
     img = gtk_image_new_from_stock (GTK_STOCK_MEDIA_NEXT, GTK_ICON_SIZE_MENU);
     gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi),img);
     gtk_widget_set_sensitive (mi, (player->priv->state == PAROLE_MEDIA_STATE_PLAYING) && dvd_menu);
@@ -977,9 +997,10 @@
 			      G_CALLBACK (parole_player_next_menu_item_activate), player);
     gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
     
-    /*Previous chapter menu item
+    /*
+     * Previous chapter menu item
      */
-    mi = gtk_image_menu_item_new_with_label (_("Previous Chapter"));
+    mi = gtk_image_menu_item_new_with_label (media_type == PAROLE_MEDIA_TYPE_CDDA ? _("Previous Track") : _("Previous Chapter"));
     img = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PREVIOUS, GTK_ICON_SIZE_MENU);
     gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), img);
 					     
@@ -1303,6 +1324,21 @@
 				    TRUE);
 }
 
+static void
+parole_player_set_sound_menu_items_image (GtkBuilder *builder)
+{
+    GtkWidget *img;
+    
+    img = gtk_image_new_from_icon_name ("audio-volume-muted", GTK_ICON_SIZE_MENU);
+    gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (gtk_builder_get_object (builder, "volume-mute-menu")), img);
+    
+    img = gtk_image_new_from_icon_name ("audio-volume-high", GTK_ICON_SIZE_MENU);
+    gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (gtk_builder_get_object (builder, "volume-up-menu")), img);
+    
+    img = gtk_image_new_from_icon_name ("audio-volume-low", GTK_ICON_SIZE_MENU);
+    gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (gtk_builder_get_object (builder, "volume-down-menu")), img);
+}
+
 gboolean
 parole_player_configure_event_cb (GtkWidget *widget, GdkEventConfigure *ev, ParolePlayer *player)
 {
@@ -1365,6 +1401,9 @@
     player->priv->buffering = FALSE;
     player->priv->row = NULL;
     
+    player->priv->recent = gtk_recent_manager_get_default ();
+    
+    parole_player_set_sound_menu_items_image (builder);
     /*
      * Gst signals
      */
@@ -1492,3 +1531,8 @@
 {
     parole_player_disc_selected_cb (NULL, uri, player);
 }
+
+void parole_player_terminate (ParolePlayer *player)
+{
+    parole_player_delete_event_cb (NULL, NULL, player);
+}

Modified: parole/trunk/parole/parole-player.h
===================================================================
--- parole/trunk/parole/parole-player.h	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-player.h	2009-07-31 21:33:33 UTC (rev 7882)
@@ -53,6 +53,8 @@
 void				 parole_player_play_uri_disc   (ParolePlayer *player,
 								const gchar *uri);
 
+void				 parole_player_terminate       (ParolePlayer *player);
+
 G_END_DECLS
 
 #endif /* __PAROLE_PLAYER_H */

Modified: parole/trunk/parole/parole-rc-utils.c
===================================================================
--- parole/trunk/parole/parole-rc-utils.c	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-rc-utils.c	2009-07-31 21:33:33 UTC (rev 7882)
@@ -28,19 +28,15 @@
 
 #include <glib.h>
 
-#include <libxfce4util/libxfce4util.h>
-
 #include "parole-rc-utils.h"
 
-#define MEDIA_PLAYER_RESOURCE_FILE 	"xfce4/parole/parole-media-player.rc"
-#define HISTORY_FILE 			"xfce4/parole/history"
-
-static XfceRc *
-open_resource_file (const gchar *group, gboolean readonly)
+XfceRc *
+parole_get_resource_file (const gchar *group, gboolean readonly)
 {
     gchar *file;
     XfceRc *rc;
-    file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, MEDIA_PLAYER_RESOURCE_FILE, TRUE);
+    
+    file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, PAROLE_RESOURCE_FILE, TRUE);
     rc = xfce_rc_simple_open (file, readonly);
     
     if (rc)
@@ -53,7 +49,7 @@
 
 void parole_rc_write_entry_bool (const gchar *property, const gchar *group, gboolean value)
 {
-    XfceRc *rc = open_resource_file (group, FALSE);
+    XfceRc *rc = parole_get_resource_file (group, FALSE);
     
     xfce_rc_write_bool_entry (rc, property, value);
     xfce_rc_close (rc);
@@ -61,7 +57,7 @@
 
 void parole_rc_write_entry_int (const gchar *property, const gchar *group, gint value)
 {
-    XfceRc *rc = open_resource_file (group, FALSE);
+    XfceRc *rc = parole_get_resource_file (group, FALSE);
     
     xfce_rc_write_int_entry (rc, property, value);
     xfce_rc_close (rc);
@@ -69,7 +65,7 @@
 
 void parole_rc_write_entry_string (const gchar *property, const gchar *group, const gchar *value)
 {
-    XfceRc *rc = open_resource_file (group, FALSE);
+    XfceRc *rc = parole_get_resource_file (group, FALSE);
     
     xfce_rc_write_entry (rc, property, value);
     xfce_rc_close (rc);
@@ -77,7 +73,7 @@
 
 void parole_rc_write_entry_list (const gchar *property, const gchar *group, gchar **value)
 {
-    XfceRc *rc = open_resource_file (group, FALSE);
+    XfceRc *rc = parole_get_resource_file (group, FALSE);
     
     xfce_rc_write_list_entry (rc, property, value, ";");
     xfce_rc_close (rc);
@@ -85,7 +81,7 @@
 
 gboolean parole_rc_read_entry_bool (const gchar *property, const gchar *group, gboolean fallback)
 {
-    XfceRc *rc = open_resource_file (group, TRUE);
+    XfceRc *rc = parole_get_resource_file (group, TRUE);
     gboolean ret_val = fallback;
     
     if ( rc )
@@ -99,7 +95,7 @@
 
 gint parole_rc_read_entry_int (const gchar *property, const gchar *group, gint fallback)
 {
-    XfceRc *rc = open_resource_file (group, TRUE);
+    XfceRc *rc = parole_get_resource_file (group, TRUE);
     gint ret_val = fallback;
     
     if ( rc )
@@ -114,7 +110,7 @@
 const gchar *parole_rc_read_entry_string (const gchar *property, const gchar *group, const gchar *fallback)
 {
     const gchar *ret_val = fallback;
-    XfceRc *rc = open_resource_file (group, TRUE);
+    XfceRc *rc = parole_get_resource_file (group, TRUE);
     
     if ( rc )
     {
@@ -128,7 +124,7 @@
 gchar **parole_rc_read_entry_list (const gchar *property, const gchar *group)
 {
     gchar **ret_val = NULL;
-    XfceRc *rc = open_resource_file (group, TRUE);
+    XfceRc *rc = parole_get_resource_file (group, TRUE);
     
     if ( rc )
     {
@@ -146,7 +142,7 @@
     gchar *contents = NULL;
     gsize length = 0;
     
-    history = xfce_resource_lookup (XFCE_RESOURCE_CACHE, HISTORY_FILE);
+    history = xfce_resource_lookup (XFCE_RESOURCE_CACHE, PAROLE_HISTORY_FILE);
     
     if (history && g_file_get_contents (history, &contents, &length, NULL)) 
     {
@@ -163,7 +159,7 @@
 {
     gchar *history = NULL;
     
-    history = xfce_resource_save_location (XFCE_RESOURCE_CACHE, HISTORY_FILE, TRUE);
+    history = xfce_resource_save_location (XFCE_RESOURCE_CACHE, PAROLE_HISTORY_FILE, TRUE);
     
     if ( history ) 
     {

Modified: parole/trunk/parole/parole-rc-utils.h
===================================================================
--- parole/trunk/parole/parole-rc-utils.h	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-rc-utils.h	2009-07-31 21:33:33 UTC (rev 7882)
@@ -21,9 +21,17 @@
 #ifndef __RC_UTILS_
 #define __RC_UTILS_
 
+#include <libxfce4util/libxfce4util.h>
+
+#define PAROLE_RESOURCE_FILE 		"xfce4/parole/parole-media-player.rc"
+#define PAROLE_HISTORY_FILE 		"xfce4/parole/history"
+
 #define PAROLE_RC_GROUP_GENERAL		"General"
 #define PAROLE_RC_GROUP_PLUGINS		"Plugins"
 
+XfceRc                 *parole_get_resource_file        (const gchar *group, 
+							 gboolean readonly);
+
 void			parole_rc_write_entry_bool	(const gchar *property,
 							 const gchar *group,
 							 gboolean value);

Modified: parole/trunk/parole/parole-stream.c
===================================================================
--- parole/trunk/parole/parole-stream.c	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-stream.c	2009-07-31 21:33:33 UTC (rev 7882)
@@ -59,7 +59,8 @@
     gint        video_w;
     gint        video_h;
     gint64  	absolute_duration;
-    
+    guint	tracks;
+    guint        track;
     gchar      *title;
     gchar      *artist;
     gchar      *year;
@@ -78,6 +79,8 @@
     PROP_HAS_AUDIO,
     PROP_HAS_VIDEO,
     PROP_SEEKABLE,
+    PROP_TRACKS,
+    PROP_TRACK,
     PROP_TAG_AVAILABLE,
     PROP_DURATION,
     PROP_ABSOLUTE_DURATION,
@@ -109,6 +112,8 @@
 	type = PAROLE_MEDIA_TYPE_SVCD;
     else if ( g_str_has_prefix (uri, "cdda:/") )
 	type = PAROLE_MEDIA_TYPE_CDDA;
+    else if ( g_str_has_prefix (uri, "dvb:/") )
+	type = PAROLE_MEDIA_TYPE_DVB;
     else 
 	type = PAROLE_MEDIA_TYPE_UNKNOWN;
     
@@ -151,6 +156,12 @@
 	case PROP_SEEKABLE:
 	    PAROLE_STREAM_GET_PRIVATE (stream)->seekable = g_value_get_boolean (value);
 	    break;
+	case PROP_TRACKS:
+	    PAROLE_STREAM_GET_PRIVATE (stream)->tracks = g_value_get_uint (value);
+	    break;
+	case PROP_TRACK:
+	    PAROLE_STREAM_GET_PRIVATE (stream)->track = g_value_get_uint (value);
+	    break;
 	case PROP_TAG_AVAILABLE:
 	    PAROLE_STREAM_GET_PRIVATE (stream)->tag_available = g_value_get_boolean (value);
 	    break;
@@ -218,6 +229,12 @@
 	case PROP_DURATION:
 	    g_value_set_double (value, PAROLE_STREAM_GET_PRIVATE (stream)->duration);
 	    break;
+	case PROP_TRACKS:
+	    g_value_set_uint (value, PAROLE_STREAM_GET_PRIVATE (stream)->tracks);
+	    break;
+	case PROP_TRACK:
+	    g_value_set_uint (value, PAROLE_STREAM_GET_PRIVATE (stream)->track);
+	    break;
 	case PROP_TAG_AVAILABLE:
 	    g_value_set_double (value, PAROLE_STREAM_GET_PRIVATE (stream)->tag_available);
 	    break;
@@ -431,8 +448,37 @@
 							  0, G_MAXINT,
 							  0,
 							  G_PARAM_READWRITE));
+	
+    /**
+     * ParoleStream:num-tracks:
+     * 
+     * Number of tracks in the cdda source, only valid if
+     * ParoleStream:media-type: is PAROLE_MEDIA_TYPE_CDDA.
+     * 
+     * Since: 0.1 
+     **/
+    g_object_class_install_property (object_class,
+				     PROP_TRACKS,
+				     g_param_spec_uint   ("num-tracks",
+							  NULL, NULL,
+							  1, 99,
+							  1,
+							  G_PARAM_READWRITE));
 							  
     /**
+     * ParoleStream:track:
+     * 
+     * 
+     * Since: 0.1 
+     **/
+    g_object_class_install_property (object_class,
+				     PROP_TRACK,
+				     g_param_spec_uint   ("track",
+							  NULL, NULL,
+							  1, 99,
+							  1,
+							  G_PARAM_READWRITE));
+    /**
      * ParoleStream:title:
      * 
      * 
@@ -536,6 +582,8 @@
     priv->media_type = PAROLE_MEDIA_TYPE_UNKNOWN;
     priv->video_h = 0;
     priv->video_w = 0;
+    priv->tracks = 1;
+    priv->track = 1;
     
     PAROLE_STREAM_FREE_STR_PROP (priv->title);
     PAROLE_STREAM_FREE_STR_PROP (priv->uri);

Modified: parole/trunk/parole/parole-stream.h
===================================================================
--- parole/trunk/parole/parole-stream.h	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-stream.h	2009-07-31 21:33:33 UTC (rev 7882)
@@ -37,6 +37,7 @@
     PAROLE_MEDIA_TYPE_VCD,
     PAROLE_MEDIA_TYPE_SVCD,
     PAROLE_MEDIA_TYPE_DVD,
+    PAROLE_MEDIA_TYPE_DVB,
     PAROLE_MEDIA_TYPE_REMOTE
     
 } ParoleMediaType;

Modified: parole/trunk/parole/parole-utils.c
===================================================================
--- parole/trunk/parole/parole-utils.c	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-utils.c	2009-07-31 21:33:33 UTC (rev 7882)
@@ -350,8 +350,8 @@
 gboolean
 parole_is_uri_disc (const gchar *uri)
 {
-    if (   !g_strcmp0 (uri, "dvd:/")  || !g_strcmp0 (uri, "vcd:/") 
-        || !g_strcmp0 (uri, "svcd:/") || !g_strcmp0 (uri, "cdda:/"))
+    if (   g_str_has_prefix (uri, "dvd:/")  || g_str_has_prefix (uri, "vcd:/") 
+        || g_str_has_prefix (uri, "svcd:/") || g_str_has_prefix (uri, "cdda:/"))
 	return TRUE;
     else
 	return FALSE;

Modified: parole/trunk/po/parole-media-player.pot
===================================================================
--- parole/trunk/po/parole-media-player.pot	2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/po/parole-media-player.pot	2009-07-31 21:33:33 UTC (rev 7882)
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-27 18:02+0200\n"
+"POT-Creation-Date: 2009-07-31 23:30+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"
@@ -17,29 +17,106 @@
 "Content-Transfer-Encoding: 8bit\n"
 
 #: ../data/interfaces/parole.ui.h:1
+msgid "16:9 (Widescreen)"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:2
+msgid "20:9 (DVB)"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:3
+msgid "4:3 (TV)"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:4
+msgid "Aspect Ratio"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:5
+msgid "Auto"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:6
+msgid "Chapter Menu"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:7
+msgid "DVD Menu"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:8
 msgid "Media player"
 msgstr ""
 
-#: ../data/interfaces/parole.ui.h:2
+#: ../data/interfaces/parole.ui.h:9
+msgid "Mute"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:10 ../parole/parole-player.c:991
+msgid "Next Chapter"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:11
+msgid "None"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:12 ../data/desktop/parole.desktop.in.in.h:1
+#: ../parole/parole-player.c:220
+msgid "Parole Media Player"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:13
 msgid "Plugins"
 msgstr ""
 
-#: ../data/interfaces/parole.ui.h:3
+#: ../data/interfaces/parole.ui.h:14 ../parole/parole-player.c:1003
+msgid "Previous Chapter"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:15
+msgid "Repeat"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:16
+msgid "Shuffle"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:17
+msgid "Sound"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:18
+msgid "Square"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:19
+msgid "Volume Down"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:20
+msgid "Volume Up"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:21
 msgid "_Edit"
 msgstr ""
 
-#: ../data/interfaces/parole.ui.h:4
+#: ../data/interfaces/parole.ui.h:22
 msgid "_Help"
 msgstr ""
 
-#: ../data/interfaces/parole.ui.h:5
+#: ../data/interfaces/parole.ui.h:23
 msgid "_Media"
 msgstr ""
 
-#: ../data/interfaces/parole.ui.h:6
+#: ../data/interfaces/parole.ui.h:24
 msgid "_View"
 msgstr ""
 
+#: ../data/interfaces/parole.ui.h:25
+msgid "gtk-leave-fullscreen"
+msgstr ""
+
 #: ../data/interfaces/plugins.ui.h:1
 msgid "<b>Author:</b>"
 msgstr ""
@@ -85,7 +162,7 @@
 msgstr ""
 
 #: ../data/interfaces/parole-settings.ui.h:4
-msgid "Automatically load subtitle when playing movie file"
+msgid "Automatically load subtitles when playing movie file"
 msgstr ""
 
 #: ../data/interfaces/parole-settings.ui.h:5
@@ -93,25 +170,23 @@
 msgstr ""
 
 #: ../data/interfaces/parole-settings.ui.h:6
-msgid ""
-"Changing this will take effect after parole is restarted or a new media file "
-"is loaded."
+msgid "Contrast:"
 msgstr ""
 
 #: ../data/interfaces/parole-settings.ui.h:7
-msgid "Contrast:"
+msgid "Enable visualization when playing audio file"
 msgstr ""
 
 #: ../data/interfaces/parole-settings.ui.h:8
-msgid "Enable visualization when playing audio file"
+msgid "Encoding: "
 msgstr ""
 
 #: ../data/interfaces/parole-settings.ui.h:9
-msgid "Encoding: "
+msgid "Font:"
 msgstr ""
 
 #: ../data/interfaces/parole-settings.ui.h:10
-msgid "Font:"
+msgid "Hue:"
 msgstr ""
 
 #: ../data/interfaces/parole-settings.ui.h:11
@@ -123,6 +198,14 @@
 msgstr ""
 
 #: ../data/interfaces/parole-settings.ui.h:13
+msgid "Reset To Defaults"
+msgstr ""
+
+#: ../data/interfaces/parole-settings.ui.h:14
+msgid "Saturation:"
+msgstr ""
+
+#: ../data/interfaces/parole-settings.ui.h:15
 msgid "Visualization type:"
 msgstr ""
 
@@ -134,118 +217,136 @@
 msgid "Select File Types (By Extension)"
 msgstr ""
 
-#: ../data/desktop/parole.desktop.in.in.h:1 ../parole/parole-player.c:154
-msgid "Parole Media Player"
+#: ../parole/main.c:52
+#, c-format
+msgid ""
+"\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"
 msgstr ""
 
-#: ../parole/main.c:135
+#: ../parole/main.c:156
 msgid "Open a new instance"
 msgstr ""
 
-#: ../parole/main.c:136
+#: ../parole/main.c:157
+msgid "Version information"
+msgstr ""
+
+#: ../parole/main.c:158
 msgid "Media to play"
 msgstr ""
 
-#: ../parole/main.c:152
+#: ../parole/main.c:172
 #, c-format
 msgid "Type '%s --help' for usage."
 msgstr ""
 
-#: ../parole/parole-gst.c:806
-msgid "Error in changing state to ready"
-msgstr ""
-
-#: ../parole/parole-gst.c:855
+#: ../parole/parole-gst.c:1271
 msgid ""
 "Unable to load playbin GStreamer plugin, check your GStreamer installation"
 msgstr ""
 
-#: ../parole/parole-gst.c:870
+#: ../parole/parole-gst.c:1287
 msgid ""
 "Unable to load video GStreamer plugin, check your GStreamer installation"
 msgstr ""
 
-#: ../parole/parole-mediachooser.c:171
+#: ../parole/parole-mediachooser.c:154
 msgid "Add media files"
 msgstr ""
 
-#: ../parole/parole-mediachooser.c:190
+#: ../parole/parole-mediachooser.c:173
 msgid "Add"
 msgstr ""
 
-#: ../parole/parole-mediachooser.c:210
-msgid "Open location..."
-msgstr ""
-
-#: ../parole/parole-mediachooser.c:212
-msgid "Open location of media file or live stream"
-msgstr ""
-
-#: ../parole/parole-medialist.c:380
+#: ../parole/parole-medialist.c:381
 msgid "Error saving playlist file"
 msgstr ""
 
-#: ../parole/parole-medialist.c:380
+#: ../parole/parole-medialist.c:381
 msgid "Permission denied"
 msgstr ""
 
-#: ../parole/parole-medialist.c:389
+#: ../parole/parole-medialist.c:390
 msgid "Unknown playlist format, Please select a support playlist format"
 msgstr ""
 
-#: ../parole/parole-medialist.c:455 ../parole/parole-player.c:963
+#: ../parole/parole-medialist.c:456 ../parole/parole-player.c:1461
 msgid "Playlist"
 msgstr ""
 
-#: ../parole/parole-medialist.c:462
+#: ../parole/parole-medialist.c:463
 msgid "M3U Playlists"
 msgstr ""
 
-#: ../parole/parole-medialist.c:470
+#: ../parole/parole-medialist.c:471
 msgid "PLS Playlists"
 msgstr ""
 
-#: ../parole/parole-medialist.c:478
+#: ../parole/parole-medialist.c:479
 msgid "Advanced Stream Redirector"
 msgstr ""
 
-#: ../parole/parole-medialist.c:486
+#: ../parole/parole-medialist.c:487
 msgid "Shareable Playlist"
 msgstr ""
 
-#: ../parole/parole-medialist.c:760
+#: ../parole/parole-medialist.c:788
 msgid "Media list"
 msgstr ""
 
-#: ../parole/parole-player.c:175
+#: ../parole/parole-player.c:283
 msgid "Hide playlist"
 msgstr ""
 
-#: ../parole/parole-player.c:184
+#: ../parole/parole-player.c:292
 msgid "Show playlist"
 msgstr ""
 
-#: ../parole/parole-player.c:338 ../parole/parole-statusbar.c:125
-#: ../parole/parole-statusbar.c:127
-msgid "Playing"
+#: ../parole/parole-player.c:501
+msgid "Media stream is not seekable"
 msgstr ""
 
-#: ../parole/parole-player.c:339
-msgid "Media stream is not seekable"
+#.
+#. * Next chapter menu item
+#.
+#: ../parole/parole-player.c:991
+msgid "Next Track"
 msgstr ""
 
-#: ../parole/parole-player.c:357 ../parole/parole-player.c:370
-msgid "Paused"
+#.
+#. * Previous chapter menu item
+#.
+#: ../parole/parole-player.c:1003
+msgid "Previous Track"
 msgstr ""
 
-#: ../parole/parole-player.c:388
+#: ../parole/parole-statusbar.c:59
+msgid "Buffering"
+msgstr ""
+
+#: ../parole/parole-statusbar.c:76
 msgid "Stopped"
 msgstr ""
 
-#: ../parole/parole-statusbar.c:137
-msgid "Buffering"
+#: ../parole/parole-statusbar.c:80
+msgid "Finished"
 msgstr ""
 
+#: ../parole/parole-statusbar.c:87 ../parole/parole-statusbar.c:95
+msgid "Paused"
+msgstr ""
+
+#: ../parole/parole-statusbar.c:116
+msgid "Live stream:"
+msgstr ""
+
 #: ../parole/parole-filters.c:57
 msgid "Audio"
 msgstr ""
@@ -270,7 +371,7 @@
 msgid "translator-credits"
 msgstr ""
 
-#: ../parole/parole-disc.c:131
+#: ../parole/parole-disc.c:168
 msgid "Play Disc"
 msgstr ""
 
@@ -441,6 +542,14 @@
 msgid "Vietnamese"
 msgstr ""
 
+#: ../parole/parole-open-location.c:171
+msgid "Open location..."
+msgstr ""
+
+#: ../parole/parole-open-location.c:173
+msgid "Open location of media file or live stream"
+msgstr ""
+
 #: ../plugins/properties/stream-properties.c:44
 #: ../plugins/properties/stream-properties.c:45
 #: ../plugins/properties/stream-properties.c:46
@@ -479,28 +588,28 @@
 msgid "Read media properties"
 msgstr ""
 
-#: ../plugins/tray/tray-icon.c:203
+#: ../plugins/tray/tray-icon.c:222
 msgid "<b>Playing:</b>"
 msgstr ""
 
-#: ../plugins/tray/tray-icon.c:203
+#: ../plugins/tray/tray-icon.c:222
 msgid "<b>Duration:</b>"
 msgstr ""
 
-#: ../plugins/tray/tray-icon.c:328
+#: ../plugins/tray/tray-icon.c:347
 msgid "Tray icon plugin"
 msgstr ""
 
-#: ../plugins/tray/tray-icon.c:337
+#: ../plugins/tray/tray-icon.c:356
 msgid "Enable notification"
 msgstr ""
 
 #. Construct function
-#: ../plugins/tray/tray-icon.c:408
+#: ../plugins/tray/tray-icon.c:427
 msgid "Tray icon"
 msgstr ""
 
 #. Title
-#: ../plugins/tray/tray-icon.c:409
+#: ../plugins/tray/tray-icon.c:428
 msgid "Show icon in the system tray"
 msgstr ""




More information about the Goodies-commits mailing list