[Xfce4-commits] <parole:master> Added (still buggy) DVD chapters support to playlist.

Sean Davis noreply at xfce.org
Fri Dec 7 00:42:01 CET 2012


Updating branch refs/heads/master
         to 9a5b755b404162ecd2f32dba44c43bd0d1e92043 (commit)
       from 294021a74477916aa8d009ed9e03e1e2d60d3262 (commit)

commit 9a5b755b404162ecd2f32dba44c43bd0d1e92043
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Thu Dec 6 14:48:35 2012 -0500

    Added (still buggy) DVD chapters support to playlist.

 data/interfaces/playlist.ui           |    2 +-
 docs/plugin-api/tmpl/parole-file.sgml |    5 ++
 src/gst/parole-gst.c                  |   49 ++++++++++++++--
 src/gst/parole-gst.h                  |    8 +++
 src/misc/parole-file.c                |  104 ++++++++++++++++++++++++++++++++-
 src/misc/parole-file.h                |    6 ++
 src/misc/parole-stream.c              |    5 +-
 src/parole-medialist.c                |   47 +++++++++++++++
 src/parole-medialist.h                |    5 ++
 src/parole-player.c                   |   71 ++++++++++++++++++++++-
 10 files changed, 289 insertions(+), 13 deletions(-)

diff --git a/data/interfaces/playlist.ui b/data/interfaces/playlist.ui
index 3feeec1..4f2ff08 100644
--- a/data/interfaces/playlist.ui
+++ b/data/interfaces/playlist.ui
@@ -179,7 +179,7 @@
       </packing>
     </child>
     <child>
-      <object class="GtkHBox" id="hbox3">
+      <object class="GtkHBox" id="playlist_controls">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="spacing">2</property>
diff --git a/docs/plugin-api/tmpl/parole-file.sgml b/docs/plugin-api/tmpl/parole-file.sgml
index f1c69e1..5af9aaa 100644
--- a/docs/plugin-api/tmpl/parole-file.sgml
+++ b/docs/plugin-api/tmpl/parole-file.sgml
@@ -46,6 +46,11 @@ Simple file handling.
 
 </para>
 
+<!-- ##### ARG ParoleFile:dvd-chapter ##### -->
+<para>
+
+</para>
+
 <!-- ##### ARG ParoleFile:filename ##### -->
 <para>
 
diff --git a/src/gst/parole-gst.c b/src/gst/parole-gst.c
index a960252..be44b5d 100644
--- a/src/gst/parole-gst.c
+++ b/src/gst/parole-gst.c
@@ -145,6 +145,8 @@ enum
     MEDIA_TAG,
     BUFFERING,
     ERROR,
+    DVD_CHAPTER_CHANGE,
+    DVD_CHAPTER_COUNT_CHANGE,
     LAST_SIGNAL
 };
 
@@ -1168,10 +1170,12 @@ parole_gst_tag_list_get_cover (ParoleGst *gst, GstTagList *tag_list)
 static void
 parole_gst_get_meta_data_dvd (ParoleGst *gst)
 {
+    gint n_chapters;
     guint num_chapters = 1;
     guint chapter = 1;
     guint current_num_chapters;
     guint current_chapter;
+    gint64 val = -1;
     
     GstFormat format;
     
@@ -1183,17 +1187,19 @@ parole_gst_get_meta_data_dvd (ParoleGst *gst)
     format = gst_format_get_by_nick ("chapter");
 
     /* Get the number of chapters for the current title. */
-    gint64 val = -1;
     if ( gst_element_query_duration (gst->priv->playbin, &format, &val) )
     {
-        num_chapters = (guint)(gint) val;
+        n_chapters = (gint) val;
+        num_chapters = (guint) n_chapters;
         if (num_chapters != current_num_chapters)
         {
             g_object_set (G_OBJECT (gst->priv->stream),
 		              "num-tracks", num_chapters,
 		              NULL);
-            TRACE("Updated DVD chapter count: %i", num_chapters);
-            g_print("Updated DVD chapter count: %i\n", num_chapters);
+            TRACE("Updated DVD chapter count: %i", n_chapters);
+            
+            g_signal_emit (G_OBJECT (gst), signals [DVD_CHAPTER_COUNT_CHANGE], 0, 
+                n_chapters);
         }
     }
     
@@ -1208,7 +1214,10 @@ parole_gst_get_meta_data_dvd (ParoleGst *gst)
 		              "track", chapter,
 		              NULL);
             TRACE("Updated current DVD chapter: %i", chapter);
-            g_print("Updated current DVD chapter: %i\n", chapter);
+            
+            if (current_chapter != 1)
+            g_signal_emit (G_OBJECT (gst), signals [DVD_CHAPTER_CHANGE], 0, 
+                chapter);
         }
     }
     
@@ -2137,6 +2146,24 @@ parole_gst_class_init (ParoleGstClass *klass)
                       g_cclosure_marshal_VOID__STRING,
                       G_TYPE_NONE, 1, 
 		      G_TYPE_STRING);
+		      
+    signals[DVD_CHAPTER_CHANGE] = 
+        g_signal_new ("dvd-chapter-change",
+                      PAROLE_TYPE_GST,
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (ParoleGstClass, dvd_chapter_change),
+                      NULL, NULL,
+                      g_cclosure_marshal_VOID__INT,
+                      G_TYPE_NONE, 1, G_TYPE_INT);
+                      
+    signals[DVD_CHAPTER_COUNT_CHANGE] = 
+        g_signal_new ("dvd-chapter-count-change",
+                      PAROLE_TYPE_GST,
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (ParoleGstClass, dvd_chapter_count_change),
+                      NULL, NULL,
+                      g_cclosure_marshal_VOID__INT,
+                      G_TYPE_NONE, 1, G_TYPE_INT);
 
     g_object_class_install_property (object_class,
 				     PROP_CONF_OBJ,
@@ -2463,6 +2490,18 @@ void parole_gst_prev_dvd_chapter (ParoleGst *gst)
     parole_gst_change_dvd_chapter (gst, -1);
 }
 
+void parole_gst_set_dvd_chapter (ParoleGst *gst, gint chapter)
+{
+    GstFormat format = gst_format_get_by_nick ("chapter");
+    guint64 val = (guint64) chapter;
+    
+    gst_element_seek (gst->priv->playbin, 1.0, format, 
+				GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 
+			        val,
+			        GST_SEEK_TYPE_NONE,
+			        0);
+}
+
 gint parole_gst_get_num_tracks (ParoleGst *gst)
 {
     gint num_tracks;
diff --git a/src/gst/parole-gst.h b/src/gst/parole-gst.h
index 84d111d..00d32bd 100644
--- a/src/gst/parole-gst.h
+++ b/src/gst/parole-gst.h
@@ -75,6 +75,12 @@ typedef struct
     
     void		(*error)		 	(ParoleGst *gst,
 							 const gchar *error);
+							 
+    void		(*dvd_chapter_change)		 	(ParoleGst *gst,
+							 gint dvd_chapter_change);
+							 
+    void		(*dvd_chapter_count_change)		 	(ParoleGst *gst,
+							 gint dvd_chapter_change);
     
 } ParoleGstClass;
 
@@ -127,6 +133,8 @@ void			parole_gst_next_dvd_chapter 	(ParoleGst *gst);
 
 void			parole_gst_prev_dvd_chapter 	(ParoleGst *gst);
 
+void            parole_gst_set_dvd_chapter      (ParoleGst *gst, gint chapter);
+
 void			parole_gst_next_cdda_track 	(ParoleGst *gst);
 
 void			parole_gst_prev_cdda_track 	(ParoleGst *gst);
diff --git a/src/misc/parole-file.c b/src/misc/parole-file.c
index 996a74b..50a9bd3 100644
--- a/src/misc/parole-file.c
+++ b/src/misc/parole-file.c
@@ -48,6 +48,7 @@ struct _ParoleFilePrivate
     gchar   *content_type;
 	gchar	*directory;
 	gchar   *custom_subtitles;
+	gint    dvd_chapter;
     
 };
 
@@ -59,7 +60,8 @@ enum
     PROP_URI,
     PROP_CONTENT_TYPE,
 	PROP_DIRECTORY,
-	PROP_CUSTOM_SUBTITLES
+	PROP_CUSTOM_SUBTITLES,
+	PROP_DVD_CHAPTER
 };
 
 G_DEFINE_TYPE (ParoleFile, parole_file, G_TYPE_OBJECT)
@@ -115,6 +117,9 @@ parole_file_set_property (GObject *object, guint prop_id,
 	case PROP_CUSTOM_SUBTITLES:
 	    PAROLE_FILE_GET_PRIVATE (file)->custom_subtitles = g_value_dup_string (value);
 	    break;
+    case PROP_DVD_CHAPTER:
+	    PAROLE_FILE_GET_PRIVATE (file)->dvd_chapter = g_value_get_int (value);
+	    break;
 	default:
 	    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 	    break;
@@ -149,6 +154,9 @@ parole_file_get_property (GObject *object, guint prop_id,
     case PROP_CUSTOM_SUBTITLES:
         g_value_set_string (value, PAROLE_FILE_GET_PRIVATE (file)->custom_subtitles);
         break;
+    case PROP_DVD_CHAPTER:
+	    g_value_set_int (value, PAROLE_FILE_GET_PRIVATE (file)->dvd_chapter);
+	    break;
 	default:
 	    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 	    break;
@@ -180,6 +188,15 @@ parole_file_constructed (GObject *object)
         return;
     }
     
+    if ( g_str_has_prefix(filename, "dvd") )
+    {
+        priv->directory = NULL;
+        priv->uri = "dvd:/";
+        priv->content_type = "dvd";
+        g_free(filename);
+        return;
+    }
+    
     g_free(filename);
     
     gfile = g_file_new_for_commandline_arg (priv->filename);
@@ -348,7 +365,7 @@ parole_file_class_init (ParoleFileClass *klass)
      *
      * The custom subtitles set by the user.
      *
-     * Since: 0.3.0.4
+     * Since: 0.4
      **/
     g_object_class_install_property (object_class,
 				     PROP_CUSTOM_SUBTITLES,
@@ -358,6 +375,24 @@ parole_file_class_init (ParoleFileClass *klass)
 							  NULL,
 							  G_PARAM_CONSTRUCT_ONLY|
 							  G_PARAM_READWRITE));
+							  
+    /**
+     * ParoleFile:dvd_chapter:
+     *
+     * DVD Chapter, used for seeking a DVD using the playlist.
+     *
+     * Since: 0.4
+     **/
+    g_object_class_install_property (object_class,
+				     PROP_DVD_CHAPTER,
+				     g_param_spec_int ("dvd-chapter",
+							  "DVD Chapter", 
+							  "DVD Chapter, used for seeking a DVD using the playlist.",
+							  -1,
+							  1000,
+							  -1,
+							  G_PARAM_CONSTRUCT_ONLY|
+							  G_PARAM_READWRITE));
 
     g_type_class_add_private (klass, sizeof (ParoleFilePrivate));
 }
@@ -375,6 +410,7 @@ parole_file_init (ParoleFile *file)
     priv->content_type    = NULL;
 	priv->directory			= NULL;
 	priv->custom_subtitles = NULL;
+	priv->dvd_chapter = 0;
 }
 
 /**
@@ -444,6 +480,32 @@ parole_file_new_cdda_track (const gint track_num, const gchar *display_name)
 }
 
 /**
+ * parole_file_new_dvd_chapter:
+ * @track_num: dvd chapter number.
+ * 
+ * 
+ * 
+ * Returns: A new #ParoleFile object.
+ * 
+ * Since: 0.4
+ **/
+ParoleFile *
+parole_file_new_dvd_chapter (gint chapter_num, const gchar *display_name)
+{
+    ParoleFile *file = NULL;
+    gchar *uri = "dvd:/";
+
+    file = g_object_new (PAROLE_TYPE_FILE, 
+		 "filename", uri, 
+		 "display-name", display_name, 
+		 "dvd-chapter", chapter_num,
+		 NULL);
+    
+    //g_free(uri); FIXME This should probably be freed.
+    return file;
+}
+
+/**
  * parole_file_get_file_name:
  * @file: a #ParoleFile.
  *  
@@ -535,7 +597,7 @@ parole_file_get_directory (const ParoleFile *file)
  *
  * Returns: A string containing the custom subtitles file path.
  *
- * Since: 0.3.0.4
+ * Since: 0.4
  **/
 const gchar *
 parole_file_get_custom_subtitles (const ParoleFile *file)
@@ -560,3 +622,39 @@ parole_file_set_custom_subtitles (const ParoleFile *file, gchar *suburi)
 							  G_PARAM_CONSTRUCT_ONLY|
 							  G_PARAM_READWRITE));
 }
+
+/**
+ * parole_file_get_dvd_chapter:
+ * @file: a #ParoleFile.
+ *
+ *
+ * Returns: An int containing the dvd chapter number.
+ *
+ * Since: 0.4
+ **/
+gint
+parole_file_get_dvd_chapter (const ParoleFile *file)
+{
+    //g_return_val_if_fail (PAROLE_IS_FILE (file), NULL);
+    
+    return PAROLE_FILE_GET_PRIVATE (file)->dvd_chapter;
+}
+
+void
+parole_file_set_dvd_chapter (const ParoleFile *file, gint dvd_chapter)
+{
+    GValue value = G_VALUE_INIT;
+    g_value_init (&value, G_TYPE_INT);
+    g_value_set_int (&value, dvd_chapter);
+    
+    parole_file_set_property (G_OBJECT(file), PROP_DVD_CHAPTER, 
+			      &value, g_param_spec_int ("dvd-chapter",
+							  "DVD Chapter", 
+							  "DVD Chapter, used for seeking a DVD using the playlist.",
+							  -1,
+							  1000,
+							  -1,
+							  G_PARAM_CONSTRUCT_ONLY|
+							  G_PARAM_READWRITE));
+}
+
diff --git a/src/misc/parole-file.h b/src/misc/parole-file.h
index 6fc5b9c..b43e7d7 100644
--- a/src/misc/parole-file.h
+++ b/src/misc/parole-file.h
@@ -54,9 +54,13 @@ ParoleFile       	       *parole_file_new_with_display_name (const gchar *filena
 								   const gchar *display_name);
 								   
 ParoleFile                 *parole_file_new_cdda_track (const gint track_num, const gchar *display_name);
+
+ParoleFile                 *parole_file_new_dvd_chapter (gint chapter_num, const gchar *display_name);
 								   
 
 void parole_file_set_custom_subtitles (const ParoleFile *file, gchar *suburi);
+
+void parole_file_set_dvd_chapter (const ParoleFile *file, gint dvd_chapter);
                                    
 const gchar   G_CONST_RETURN   *parole_file_get_directory 	  (const ParoleFile *file) G_GNUC_PURE;
 
@@ -70,6 +74,8 @@ const gchar   G_CONST_RETURN   *parole_file_get_content_type      (const ParoleF
 
 const gchar   G_CONST_RETURN   *parole_file_get_custom_subtitles (const ParoleFile *file) G_GNUC_PURE;
 
+gint parole_file_get_dvd_chapter (const ParoleFile *file);
+
 G_END_DECLS
 
 #endif /* __PAROLE_MEDIA_FILE_H */
diff --git a/src/misc/parole-stream.c b/src/misc/parole-stream.c
index c31dfb5..781571e 100644
--- a/src/misc/parole-stream.c
+++ b/src/misc/parole-stream.c
@@ -593,7 +593,8 @@ parole_stream_class_init (ParoleStreamClass *klass)
      * ParoleStream:track:
      * 
      * Currently playing track, this is only valid if
-     * #ParoleStream:media-type: is PAROLE_MEDIA_TYPE_CDDA.
+     * #ParoleStream:media-type: is PAROLE_MEDIA_TYPE_CDDA 
+     *                           or PAROLE_MEDIA_TYPE_DVD.
      * 
      * Since: 0.2 
      **/
@@ -602,7 +603,7 @@ parole_stream_class_init (ParoleStreamClass *klass)
 				     g_param_spec_uint   ("track",
 							  "Track", 
 							  "Track",
-							  1, 99,
+							  0, 99,
 							  1,
 							  G_PARAM_READWRITE));
     /**
diff --git a/src/parole-medialist.c b/src/parole-medialist.c
index b3c4fc8..a310b56 100644
--- a/src/parole-medialist.c
+++ b/src/parole-medialist.c
@@ -189,6 +189,7 @@ struct ParoleMediaListPrivate
     GtkWidget *dvd_menu;
     GtkWidget *dvd_menu_button;
     GtkWidget *dvd_label;
+    GtkWidget *playlist_controls;
 
     GtkWidget *remove_button;
     GtkWidget *clear_button;
@@ -347,6 +348,23 @@ parole_media_list_add_cdda_tracks (ParoleMediaList *list, gint n_tracks)
     parole_media_list_files_open(list, files, TRUE);
 }
 
+void
+parole_media_list_add_dvd_chapters (ParoleMediaList *list, gint n_chapters)
+{
+    GSList *files = NULL;
+    ParoleFile *file;
+    gint i;
+    
+    for (i = 0; i < n_chapters; i++)
+    {
+        file = PAROLE_FILE(parole_file_new_dvd_chapter( i+1, g_strdup_printf( _("Chapter %i"), i+1) ));
+        files = g_slist_append(files, file);
+    }
+    
+    //parole_media_list_clear_list (list);
+    parole_media_list_files_open(list, files, TRUE);
+}
+
 /* Callback to determine whether opened files should start playing immediately */
 static void
 parole_media_list_files_opened_cb (ParoleMediaChooser *chooser, 
@@ -1153,6 +1171,8 @@ void
 parole_media_list_set_dvd_menu_visible(ParoleMediaList *list, gboolean visible)
 {
     gtk_widget_set_visible(list->priv->dvd_menu_button, visible);
+    /* Disable the playlist controls when in DVD mode. */
+    gtk_widget_set_sensitive(list->priv->playlist_controls, !visible);
 }
 
 void
@@ -1601,6 +1621,7 @@ parole_media_list_init (ParoleMediaList *list)
     list->priv->dvd_menu_button = GTK_WIDGET (gtk_builder_get_object(builder, "dvd_menu_button"));
     list->priv->dvd_menu = GTK_WIDGET (gtk_builder_get_object(builder, "dvd-menu"));
     list->priv->dvd_label = GTK_WIDGET (gtk_builder_get_object(builder, "dvd_label"));
+    list->priv->playlist_controls = GTK_WIDGET (gtk_builder_get_object(builder, "playlist_controls"));
     
     g_signal_connect (GTK_TOGGLE_BUTTON(list->priv->dvd_menu_button), "toggled",
 		      G_CALLBACK (parole_media_list_show_dvd_menu), list);
@@ -1769,6 +1790,32 @@ GtkTreeRowReference *parole_media_list_get_prev_row (ParoleMediaList *list,
     return prev;
 }
 
+GtkTreeRowReference *parole_media_list_get_row_n (ParoleMediaList *list, 
+						                          gint wanted_row)
+{
+    GtkTreeRowReference *row = NULL;
+    GtkTreePath *path;
+    GtkTreeIter iter;
+    
+    if (wanted_row == -1)
+        return NULL;
+        
+    path = gtk_tree_path_new_from_string( g_strdup_printf("%i", wanted_row) );
+
+    if ( gtk_tree_model_get_iter (GTK_TREE_MODEL (list->priv->store), &iter, path))
+    {
+	row = gtk_tree_row_reference_new (GTK_TREE_MODEL (list->priv->store), path);
+	//parole_media_list_select_path (list, path);
+    }
+    
+    gtk_tree_path_free (path);
+    
+    if ( !gtk_tree_row_reference_valid (row) )
+	return NULL;
+    
+    return row;
+}
+
 GtkTreeRowReference *parole_media_list_get_row_random (ParoleMediaList *list)
 {
     GtkTreeRowReference *row = NULL;
diff --git a/src/parole-medialist.h b/src/parole-medialist.h
index 8ca04f0..c880fa7 100644
--- a/src/parole-medialist.h
+++ b/src/parole-medialist.h
@@ -134,6 +134,11 @@ gboolean			 parole_media_list_add_files        (ParoleMediaList *list,
 								     
 void                parole_media_list_add_cdda_tracks (ParoleMediaList *list, gint n_tracks);
 
+void                parole_media_list_add_dvd_chapters (ParoleMediaList *list, gint n_chapters);
+
+GtkTreeRowReference *parole_media_list_get_row_n (ParoleMediaList *list, 
+						                          gint wanted_row);
+
 void				 parole_media_list_save_list	    (ParoleMediaList *list);
 
 void				 parole_media_list_grab_focus       (ParoleMediaList *list);
diff --git a/src/parole-player.c b/src/parole-player.c
index cbb1fb1..fd1b550 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -258,6 +258,10 @@ static void parole_player_audiotrack_radio_menu_item_changed_cb(GtkWidget *widge
 
 static void parole_player_subtitles_radio_menu_item_changed_cb(GtkWidget *widget, ParolePlayer *player);
 
+static void parole_player_dvd_chapter_count_change_cb (ParoleGst *gst, gint chapter_count, ParolePlayer *player);
+
+static void parole_player_dvd_chapter_change_cb (ParoleGst *gst, gint chapter_count, ParolePlayer *player);
+
 
 gboolean	parole_player_key_press 		(GtkWidget *widget, 
 							 GdkEventKey *ev, 
@@ -577,6 +581,17 @@ parole_player_reset (ParolePlayer *player)
     parole_media_list_set_dvd_menu_visible(player->priv->list, FALSE);
 }
 
+static void
+parole_player_dvd_reset (ParolePlayer *player)
+{
+    if ( player->priv->row )
+    {
+	parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, NULL);
+	gtk_tree_row_reference_free (player->priv->row);
+	player->priv->row = NULL;
+    }
+}
+
 
 
 static gboolean
@@ -950,9 +965,9 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
     GtkTreeIter iter;
     GtkTreeModel *model;
 
-    parole_player_reset (player);
+    //parole_player_reset (player);
     
-    player->priv->row = gtk_tree_row_reference_copy (row);
+    //player->priv->row = gtk_tree_row_reference_copy (row);
     
     model = gtk_tree_row_reference_get_model (row);
     
@@ -965,10 +980,23 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
 	    const gchar *sub = NULL;
 	    const gchar *uri;
 	    const gchar *directory = NULL;
+	    gint dvd_chapter;
 	    
 	    uri = parole_file_get_uri (file);
 	    directory = parole_file_get_directory(file);
 	    
+	    if ( g_str_has_prefix (uri, "dvd") )
+	    {
+	        parole_player_dvd_reset (player);
+	        player->priv->row = gtk_tree_row_reference_copy (row);
+	        dvd_chapter = parole_file_get_dvd_chapter(file);
+	        parole_gst_set_dvd_chapter(PAROLE_GST(player->priv->gst), dvd_chapter);
+	        g_object_unref (file);
+	        return;
+	    }
+	    parole_player_reset (player);
+	    player->priv->row = gtk_tree_row_reference_copy (row);
+	    
 	    if ( g_str_has_prefix (uri, "file:/") )
 	    {
 		if ( parole_file_filter (player->priv->video_filter, file) )
@@ -1723,6 +1751,39 @@ parole_player_buffering_cb (ParoleGst *gst, const ParoleStream *stream, gint per
     }
 }
 
+static void
+parole_player_dvd_chapter_count_change_cb (ParoleGst *gst, gint chapter_count, ParolePlayer *player)
+{
+    gtk_tree_row_reference_free (player->priv->row);
+	player->priv->row = NULL;
+	
+	/* FIXME Cannot clear list prior to adding new chapters. */
+	//parole_media_list_clear_list (player->priv->list);
+	
+    parole_media_list_add_dvd_chapters (player->priv->list, chapter_count);
+}
+
+static void
+parole_player_dvd_chapter_change_cb (ParoleGst *gst, gint chapter_count, ParolePlayer *player)
+{
+    GdkPixbuf *pix = NULL;
+    
+	parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, NULL);
+	
+    player->priv->row = parole_media_list_get_row_n (player->priv->list, chapter_count-1);
+
+    pix = parole_icon_load ("player_play", 16);
+    
+    if ( !pix )
+	pix = parole_icon_load ("gtk-media-play-ltr", 16);
+    
+    parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, pix);
+    parole_media_list_select_row (player->priv->list, player->priv->row);
+    
+    if ( pix )
+	g_object_unref (pix);
+}
+
 gboolean parole_player_delete_event_cb (GtkWidget *widget, GdkEvent *ev, ParolePlayer *player)
 {
     parole_window_busy_cursor (GTK_WIDGET (player->priv->window)->window);
@@ -2748,6 +2809,12 @@ parole_player_init (ParolePlayer *player)
    
     g_signal_connect (G_OBJECT (player->priv->gst), "buffering",
 		      G_CALLBACK (parole_player_buffering_cb), player);
+		      
+    g_signal_connect (G_OBJECT (player->priv->gst), "dvd-chapter-count-change",
+              G_CALLBACK (parole_player_dvd_chapter_count_change_cb), player);
+              
+    g_signal_connect (G_OBJECT (player->priv->gst), "dvd-chapter-change",
+              G_CALLBACK (parole_player_dvd_chapter_change_cb), player);
     
     g_signal_connect_after (G_OBJECT (player->priv->gst), "button-release-event",
 			    G_CALLBACK (parole_player_gst_widget_button_release), player);


More information about the Xfce4-commits mailing list