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

Ali Abdallah aliov at xfce.org
Tue Aug 11 11:39:04 CEST 2009


Author: aliov
Date: 2009-08-11 09:39:03 +0000 (Tue, 11 Aug 2009)
New Revision: 7906

Modified:
   parole/trunk/ChangeLog
   parole/trunk/data/interfaces/parole.ui
   parole/trunk/data/interfaces/playlist.ui
   parole/trunk/parole/main.c
   parole/trunk/parole/parole-disc-menu.c
   parole/trunk/parole/parole-disc-menu.h
   parole/trunk/parole/parole-gst.c
   parole/trunk/parole/parole-gst.h
   parole/trunk/parole/parole-medialist.c
   parole/trunk/parole/parole-player.c
   parole/trunk/parole/parole-utils.c
Log:
	* main.c show gtk and gst command line options.
	* parole-medialist.c, allow multiple selection, so handle list up 
	and down+remove when multiple rows are selected.
	* Show a button for fast tracks selection when playing cdda.

Modified: parole/trunk/ChangeLog
===================================================================
--- parole/trunk/ChangeLog	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/ChangeLog	2009-08-11 09:39:03 UTC (rev 7906)
@@ -1,3 +1,9 @@
+2009-08-11: aliov at xfce.org
+	* main.c show gtk and gst command line options.
+	* parole-medialist.c, allow multiple selection, so handle list up 
+	and down+remove when multiple rows are selected.
+	* Show a button for fast tracks selection when playing cdda.
+
 2009-08-06: 14:30 Ali aliov at xfce.org
 	* parole-gst.c Implement a timeout handler to check state change
 	failure, can potentially happen on live streams.

Modified: parole/trunk/data/interfaces/parole.ui
===================================================================
--- parole/trunk/data/interfaces/parole.ui	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/data/interfaces/parole.ui	2009-08-11 09:39:03 UTC (rev 7906)
@@ -325,73 +325,100 @@
                                     <property name="orientation">vertical</property>
                                     <property name="spacing">5</property>
                                     <child>
-                                      <object class="GtkHBox" id="dvd-box">
-                                        <property name="visible">True</property>
+                                      <object class="GtkEventBox" id="disc-box">
+                                        <property name="no_show_all">True</property>
                                         <child>
-                                          <object class="GtkButton" id="prev-chapter">
-                                            <property name="label" translatable="yes">Previous Chapter</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="receives_default">True</property>
-                                            <property name="no_show_all">True</property>
-                                            <property name="image">image1</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">0</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkButton" id="dvd-menu">
-                                            <property name="label" translatable="yes">DVD Menu</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="receives_default">True</property>
-                                            <property name="no_show_all">True</property>
-                                            <property name="image">image2</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkButton" id="chapter-menu">
-                                            <property name="label" translatable="yes">Chapter Menu</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="receives_default">True</property>
-                                            <property name="no_show_all">True</property>
-                                            <property name="image">image3</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">2</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkButton" id="next-chapter">
-                                            <property name="label" translatable="yes">Next Chapter</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="receives_default">True</property>
-                                            <property name="no_show_all">True</property>
-                                            <property name="image">image4</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">3</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkEventBox" id="eventboxinfo">
-                                            <property name="no_show_all">True</property>
+                                          <object class="GtkHBox" id="disc-menu-box">
+                                            <property name="visible">True</property>
+                                            <property name="spacing">5</property>
                                             <child>
-                                              <object class="GtkLabel" id="info">
+                                              <object class="GtkButton" id="prev-chapter">
+                                                <property name="label" translatable="yes">Previous Chapter</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="receives_default">False</property>
                                                 <property name="no_show_all">True</property>
-                                                <property name="use_markup">True</property>
+                                                <property name="image">image1</property>
+                                                <property name="relief">none</property>
                                               </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="position">0</property>
+                                              </packing>
                                             </child>
+                                            <child>
+                                              <object class="GtkButton" id="dvd-menu">
+                                                <property name="label" translatable="yes">DVD Menu</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="no_show_all">True</property>
+                                                <property name="image">image2</property>
+                                                <property name="relief">none</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="position">1</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkButton" id="chapter-menu">
+                                                <property name="label" translatable="yes">Chapter Menu</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="no_show_all">True</property>
+                                                <property name="image">image3</property>
+                                                <property name="relief">none</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="position">2</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <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">3</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <placeholder/>
+                                            </child>
+                                            <child>
+                                              <object class="GtkButton" id="select-track">
+                                                <property name="label" translatable="yes">Select Track</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="no_show_all">True</property>
+                                                <property name="image">image13</property>
+                                                <property name="relief">none</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="position">5</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkButton" id="next-chapter">
+                                                <property name="label" translatable="yes">Next Chapter</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="no_show_all">True</property>
+                                                <property name="image">image4</property>
+                                                <property name="relief">none</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="position">6</property>
+                                              </packing>
+                                            </child>
                                           </object>
-                                          <packing>
-                                            <property name="position">4</property>
-                                          </packing>
                                         </child>
                                       </object>
                                       <packing>
@@ -448,11 +475,10 @@
                                                     <property name="visible">True</property>
                                                     <property name="sensitive">False</property>
                                                     <property name="can_focus">True</property>
-                                                    <property name="receives_default">True</property>
+                                                    <property name="receives_default">False</property>
                                                     <property name="image">image7</property>
                                                     <property name="relief">none</property>
                                                     <property name="focus_on_click">False</property>
-                                                    <accelerator key="s" signal="clicked"/>
                                                     <signal name="clicked" handler="parole_player_stop_clicked"/>
                                                   </object>
                                                   <packing>
@@ -545,6 +571,7 @@
                                             <property name="can_focus">True</property>
                                             <property name="receives_default">True</property>
                                             <property name="no_show_all">True</property>
+                                            <property name="relief">none</property>
                                             <property name="use_stock">True</property>
                                             <signal name="clicked" handler="parole_player_leave_fs_cb"/>
                                           </object>
@@ -681,22 +708,21 @@
     <property name="visible">True</property>
     <property name="stock">gtk-network</property>
   </object>
-  <object class="GtkImage" id="image1">
+  <object class="GtkImage" id="image10">
     <property name="visible">True</property>
-    <property name="stock">gtk-media-previous</property>
+    <property name="icon_name">audio-volume-low</property>
   </object>
-  <object class="GtkImage" id="image2">
+  <object class="GtkImage" id="image11">
     <property name="visible">True</property>
-    <property name="stock">gtk-index</property>
+    <property name="icon_name">audio-volume-high</property>
   </object>
-  <object class="GtkImage" id="image3">
+  <object class="GtkImage" id="image12">
     <property name="visible">True</property>
-    <property name="no_show_all">True</property>
-    <property name="stock">gtk-index</property>
+    <property name="icon_name">audio-volume-muted</property>
   </object>
-  <object class="GtkImage" id="image4">
+  <object class="GtkImage" id="image18">
     <property name="visible">True</property>
-    <property name="stock">gtk-media-next</property>
+    <property name="stock">gtk-go-forward</property>
   </object>
   <object class="GtkImage" id="image6">
     <property name="visible">True</property>
@@ -714,20 +740,25 @@
     <property name="visible">True</property>
     <property name="stock">gtk-media-forward</property>
   </object>
-  <object class="GtkImage" id="image18">
+  <object class="GtkImage" id="image1">
     <property name="visible">True</property>
-    <property name="stock">gtk-go-forward</property>
+    <property name="stock">gtk-media-previous</property>
   </object>
-  <object class="GtkImage" id="image10">
+  <object class="GtkImage" id="image2">
     <property name="visible">True</property>
-    <property name="icon_name">audio-volume-low</property>
+    <property name="stock">gtk-index</property>
   </object>
-  <object class="GtkImage" id="image11">
+  <object class="GtkImage" id="image3">
     <property name="visible">True</property>
-    <property name="icon_name">audio-volume-high</property>
+    <property name="no_show_all">True</property>
+    <property name="stock">gtk-index</property>
   </object>
-  <object class="GtkImage" id="image12">
+  <object class="GtkImage" id="image4">
     <property name="visible">True</property>
-    <property name="icon_name">audio-volume-muted</property>
+    <property name="stock">gtk-media-next</property>
   </object>
+  <object class="GtkImage" id="image13">
+    <property name="visible">True</property>
+    <property name="stock">gtk-cdrom</property>
+  </object>
 </interface>

Modified: parole/trunk/data/interfaces/playlist.ui
===================================================================
--- parole/trunk/data/interfaces/playlist.ui	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/data/interfaces/playlist.ui	2009-08-11 09:39:03 UTC (rev 7906)
@@ -17,7 +17,6 @@
             <property name="can_focus">True</property>
             <property name="headers_visible">False</property>
             <property name="show_expanders">False</property>
-            <signal name="cursor_changed" handler="parole_media_list_cursor_changed_cb"/>
             <signal name="row_activated" handler="parole_media_list_row_activated_cb"/>
             <signal name="button_release_event" handler="parole_media_list_button_release_event"/>
             <signal name="drag_data_received" handler="parole_media_list_drag_data_received_cb"/>

Modified: parole/trunk/parole/main.c
===================================================================
--- parole/trunk/parole/main.c	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/main.c	2009-08-11 09:39:03 UTC (rev 7906)
@@ -54,7 +54,6 @@
              "Part of the Xfce Goodies Project\n"
              "http://goodies.xfce.org\n\n"
              "Licensed under the GNU GPL.\n\n"), VERSION);
-
     exit (EXIT_SUCCESS);
 }
 
@@ -145,7 +144,8 @@
     ParolePlayer *player;
     ParolePluginsManager *plugins;
     GtkBuilder *builder;
-    
+    GOptionContext *ctx;
+    GOptionGroup *gst_option_group;
     GError *error = NULL;
     gchar **filenames = NULL;
     gboolean new_instance = FALSE;
@@ -164,28 +164,30 @@
 
     xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
     
-    if ( !gtk_init_with_args (&argc, &argv, (gchar *)"", option_entries, (gchar *)PACKAGE, &error))
+    gtk_init (&argc, &argv);
+    
+    ctx = g_option_context_new (NULL);
+    
+    gst_option_group = gst_init_get_option_group ();
+    g_option_context_add_main_entries (ctx, option_entries, GETTEXT_PACKAGE);
+    g_option_context_set_translation_domain (ctx, GETTEXT_PACKAGE);
+    g_option_context_add_group (ctx, gst_option_group);
+
+    g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
+    
+    if ( !g_option_context_parse (ctx, &argc, &argv, &error) ) 
     {
-	if (G_LIKELY (error) ) 
-        {
-            g_printerr ("%s: %s.\n", G_LOG_DOMAIN, error->message);
-            g_printerr (_("Type '%s --help' for usage."), G_LOG_DOMAIN);
-            g_printerr ("\n");
-            g_error_free (error);
-        }
-        else
-        {
-            g_error ("Unable to open display.");
-        }
-
-        return EXIT_FAILURE;
+	g_print ("%s\n", error->message);
+	g_print ("Type %s --help to list all available command line options", argv[0]);
+	g_error_free (error);
+	g_option_context_free (ctx);
+	return EXIT_FAILURE;
     }
-
+    g_option_context_free (ctx);
+    
     if ( version )
 	show_version ();
-
-    gst_init (NULL, NULL);
-
+	
     if ( !new_instance && parole_dbus_name_has_owner (PAROLE_DBUS_NAME) )
     {
 	TRACE ("Parole is already running");

Modified: parole/trunk/parole/parole-disc-menu.c
===================================================================
--- parole/trunk/parole/parole-disc-menu.c	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-disc-menu.c	2009-08-11 09:39:03 UTC (rev 7906)
@@ -42,12 +42,18 @@
 {
     ParoleGst   *gst;
     ParoleMediaType current_media_type;
+    
+    GtkWidget	*disc_track;
+    GtkWidget   *disc_box;
+    
     GtkWidget	*next_chapter;
     GtkWidget	*prev_chapter;
     GtkWidget	*dvd_menu;
     GtkWidget	*chapter_menu;
     GtkWidget	*info;
     GtkWidget   *eventboxinfo;
+    
+    guint tracks;
 };
 
 G_DEFINE_TYPE (ParoleDiscMenu, parole_disc_menu, G_TYPE_OBJECT)
@@ -55,10 +61,12 @@
 static void
 parole_disc_menu_hide (ParoleDiscMenu *menu)
 {
+    gtk_widget_hide (menu->priv->disc_track);
     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->disc_box);
     //gtk_widget_hide (menu->priv->dvd_menu);
     //gtk_widget_hide (menu->priv->chapter_menu);
 }
@@ -73,9 +81,12 @@
     {
 	gtk_widget_show (menu->priv->eventboxinfo);
 	gtk_widget_show (menu->priv->info);
+	gtk_widget_show (menu->priv->disc_track);
     }
+    
    //gtk_widget_show (menu->priv->dvd_menu);
-   //gtk_widget_show (menu->priv->chapter_menu);
+   //gtk_widget_show (menu->priv->dvd_menu);
+   gtk_widget_show (menu->priv->disc_box);
     
 }
 
@@ -84,6 +95,7 @@
 				 ParoleMediaState state, ParoleDiscMenu *menu)
 {
     ParoleMediaType media_type;
+    menu->priv->tracks = 0;
     
     if ( state < PAROLE_MEDIA_STATE_PAUSED )
     {
@@ -121,6 +133,7 @@
 	    
 	    g_free (text);
 	    parole_disc_menu_show (menu, TRUE);
+	    menu->priv->tracks = num_tracks;
 	}
 	menu->priv->current_media_type = media_type;
     }
@@ -157,6 +170,58 @@
 }
 
 static void
+track_menu_item_activated_cb (GtkWidget *widget, ParoleDiscMenu *menu)
+{
+    guint track;
+    
+    track = GPOINTER_TO_UINT ( g_object_get_data (G_OBJECT (widget), "track"));
+    
+    parole_gst_seek_cdda (menu->priv->gst, track);
+}
+
+static void
+parole_disc_menu_show_disc_track_menu (ParoleDiscMenu *disc_menu, guint button, guint activate_time)
+{
+    GtkWidget *menu, *mi, *img;
+    gchar track[128];
+    guint i;
+    
+    menu = gtk_menu_new ();
+    
+    for ( i = 0; i < disc_menu->priv->tracks; i++)
+    {
+	img = gtk_image_new_from_stock (GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU);
+	g_snprintf (track, 128, _("Track %i"), i+1);
+	mi = gtk_image_menu_item_new_with_label (track);
+	gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), img);
+	gtk_widget_show (mi);
+	gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+	g_object_set_data (G_OBJECT (mi), "track", GUINT_TO_POINTER (i+1));
+	g_signal_connect (mi, "activate",
+		          G_CALLBACK (track_menu_item_activated_cb), disc_menu);
+    }
+    
+    g_signal_connect_swapped (menu, "selection-done",
+			      G_CALLBACK (gtk_widget_destroy), menu);
+    
+    gtk_menu_popup (GTK_MENU (menu), 
+		    NULL, NULL,
+		    NULL, NULL,
+		    button, activate_time);
+}
+
+static gboolean
+parole_disc_menu_show_disc_track (GtkWidget *widget, GdkEventButton *ev, ParoleDiscMenu *menu)
+{
+    if ( ev->button == 1 )
+    {
+	parole_disc_menu_show_disc_track_menu (menu, ev->button, ev->time);
+    }
+    
+    return FALSE;
+}
+
+static void
 parole_disc_menu_class_init (ParoleDiscMenuClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -174,20 +239,29 @@
     
     menu->priv = PAROLE_DISC_MENU_GET_PRIVATE (menu);
     
+    menu->priv->tracks = 0;
+    
     builder = parole_builder_get_main_interface ();
     
+    menu->priv->disc_track = GTK_WIDGET (gtk_builder_get_object (builder, "select-track"));
     menu->priv->next_chapter = GTK_WIDGET (gtk_builder_get_object (builder, "next-chapter"));
     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"));
+    menu->priv->disc_box = GTK_WIDGET (gtk_builder_get_object (builder, "disc-box"));
     
     gdk_color_parse ("black", &color);
+    
     gtk_widget_modify_bg (menu->priv->eventboxinfo, GTK_STATE_NORMAL, &color);
+    gtk_widget_modify_bg (menu->priv->disc_box, GTK_STATE_NORMAL, &color);
 
     menu->priv->current_media_type = PAROLE_MEDIA_TYPE_UNKNOWN;
     
+    g_signal_connect (menu->priv->disc_track, "button-press-event",
+		      G_CALLBACK (parole_disc_menu_show_disc_track), menu);
+    
     g_signal_connect_swapped (menu->priv->next_chapter, "clicked",
 			      G_CALLBACK (parole_disc_menu_next_chapter_cb), menu);
     
@@ -226,7 +300,7 @@
     return menu;
 }
 
-gboolean parole_disc_menu_visible	 (ParoleDiscMenu *menu)
+gboolean parole_disc_menu_visible (ParoleDiscMenu *menu)
 {
     return (GTK_WIDGET_VISIBLE (menu->priv->next_chapter));
 }
@@ -240,3 +314,7 @@
 {
     parole_disc_menu_prev_chapter_cb (menu);
 }
+
+void parole_disc_menu_set_fullscreen (ParoleDiscMenu *menu, gboolean fullscreen)
+{
+}

Modified: parole/trunk/parole/parole-disc-menu.h
===================================================================
--- parole/trunk/parole/parole-disc-menu.h	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-disc-menu.h	2009-08-11 09:39:03 UTC (rev 7906)
@@ -52,6 +52,9 @@
 
 void				parole_disc_menu_seek_prev	 (ParoleDiscMenu *menu);
 
+void				parole_disc_menu_set_fullscreen  (ParoleDiscMenu *menu,
+								  gboolean fullscreen);
+
 G_END_DECLS
 
 #endif /* __PAROLE_DISC_MENU_H */

Modified: parole/trunk/parole/parole-gst.c
===================================================================
--- parole/trunk/parole/parole-gst.c	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-gst.c	2009-08-11 09:39:03 UTC (rev 7906)
@@ -644,16 +644,12 @@
     gchar *sub;
     gchar *sub_uri;
     gboolean sub_enabled;
-    gboolean has_video;
     
     g_object_get (G_OBJECT (gst->priv->stream),
 		  "media-type", &type,
-		  "has-video",  &has_video,
 		  NULL);
     
-    PAROLE_DEBUG_ENUM_FULL (type, ENUM_GTYPE_MEDIA_TYPE, " has_video=%d", has_video);
-    
-    if ( type != PAROLE_MEDIA_TYPE_LOCAL_FILE || !has_video)
+    if ( type != PAROLE_MEDIA_TYPE_LOCAL_FILE)
 	return;
     
     g_object_get (G_OBJECT (gst->priv->conf),
@@ -1182,6 +1178,8 @@
 {
     GstStateChangeReturn ret;
 
+    TRACE ("Changing state to %d", new);
+    
     ret = gst_element_set_state (GST_ELEMENT (gst->priv->playbin), new);
     
     switch (ret)
@@ -1233,14 +1231,16 @@
 		  "uri", &uri,
 		  NULL);
     
+    TRACE ("Processing uri : %s", uri);
+    
     g_object_set (G_OBJECT (gst->priv->playbin),
 		  "uri", uri,
 		  "suburi", NULL,
 		  NULL);
 
     parole_gst_load_subtitle (gst);
-	    
     parole_gst_change_state (gst, GST_STATE_PLAYING);
+    
     g_free (uri);
 }
 
@@ -1670,6 +1670,21 @@
     return GTK_WIDGET (parole_gst_object);
 }
 
+static gboolean
+parole_gst_play_idle (gpointer data)
+{
+    ParoleGst *gst;
+    
+    gst = PAROLE_GST (data);
+    
+    if ( gst->priv->state < GST_STATE_PAUSED )
+	parole_gst_play_file_internal (gst);
+    else 
+	parole_gst_change_state (gst, GST_STATE_READY);
+    
+    return FALSE;
+}
+
 void parole_gst_play_uri (ParoleGst *gst, const gchar *uri)
 {
     g_mutex_lock (gst->priv->lock);
@@ -1689,10 +1704,8 @@
     
     parole_window_busy_cursor (GTK_WIDGET (gst)->window);
 
-    if ( gst->priv->state < GST_STATE_PAUSED )
-	parole_gst_play_file_internal (gst);
-    else 
-	parole_gst_change_state (gst, GST_STATE_READY);
+    g_idle_add ((GSourceFunc) parole_gst_play_idle, gst);
+    
 }
 
 void parole_gst_pause (ParoleGst *gst)
@@ -1821,6 +1834,15 @@
     parole_gst_change_cdda_track (gst, -1);
 }
 
+void parole_gst_seek_cdda	(ParoleGst *gst, guint track_num)
+{
+    gint current_track;
+    
+    current_track = parole_gst_get_current_cdda_track (gst);
+    
+    parole_gst_change_cdda_track (gst, (gint) track_num - current_track -1);
+}
+
 gint parole_gst_get_current_cdda_track (ParoleGst *gst)
 {
     GstFormat format;

Modified: parole/trunk/parole/parole-gst.h
===================================================================
--- parole/trunk/parole/parole-gst.h	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-gst.h	2009-08-11 09:39:03 UTC (rev 7906)
@@ -116,6 +116,9 @@
 
 void			parole_gst_prev_cdda_track 	(ParoleGst *gst);
 
+void			parole_gst_seek_cdda	 	(ParoleGst *gst,
+							 guint track_num);
+
 gint			parole_gst_get_current_cdda_track (ParoleGst *gst);
 
 ParoleMediaType		parole_gst_get_current_stream_type (ParoleGst *gst);

Modified: parole/trunk/parole/parole-medialist.c
===================================================================
--- parole/trunk/parole/parole-medialist.c	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-medialist.c	2009-08-11 09:39:03 UTC (rev 7906)
@@ -74,6 +74,14 @@
 static void 	parole_media_list_dbus_class_init (ParoleMediaListClass *klass);
 static void 	parole_media_list_dbus_init 	  (ParoleMediaList      *list);
 
+static GtkTreeRowReference * 
+    parole_media_list_get_row_reference_from_iter (ParoleMediaList *list, 
+						   GtkTreeIter *iter, 
+						   gboolean select_path);
+
+static void 	parole_media_list_select_path 	  (ParoleMediaList *list, 
+						   GtkTreePath *path);
+
 /*
  * Callbacks for GtkBuilder
  */
@@ -97,9 +105,6 @@
 							 GtkTreeViewColumn *col,
 							 ParoleMediaList *list);
 
-void		parole_media_list_cursor_changed_cb 	(GtkTreeView *view, 
-							 ParoleMediaList *list);
-
 gboolean	parole_media_list_button_release_event  (GtkWidget *widget, 
 							 GdkEventButton *ev, 
 							 ParoleMediaList *list);
@@ -133,6 +138,7 @@
     GtkWidget 	  	*view;
     GtkWidget		*box;
     GtkListStore	*store;
+    GtkTreeSelection    *sel;
     
     GtkWidget		*remove;
     GtkWidget		*up;
@@ -361,7 +367,34 @@
     gtk_widget_destroy (GTK_WIDGET (data->chooser));
     g_free (data);
 }
-						    
+
+static GtkTreeRowReference *
+parole_media_list_get_first_selected_row (ParoleMediaList *list)
+{
+    GtkTreeModel *model;
+    GtkTreeRowReference *row = NULL;
+    GtkTreeIter iter;
+    GList *path_list = NULL;
+    
+    path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model);
+    
+    if ( g_list_length (path_list) > 0 )
+    {
+	GtkTreePath *path;
+	path = g_list_nth_data (path_list, 0);
+	
+	if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path) == TRUE ))
+	{
+	    row = parole_media_list_get_row_reference_from_iter (list, &iter, FALSE);
+	}
+    }
+    
+    g_list_foreach (path_list, (GFunc)gtk_tree_path_free, NULL);
+    g_list_free (path_list);
+    
+    return row;
+}
+
 void parole_media_list_save_playlist_cb (GtkButton *button, ParolePlaylistSave *data)
 {
     ParolePlFormat format = PAROLE_PL_FORMAT_UNKNOWN;
@@ -503,27 +536,72 @@
     g_object_unref (builder);
 }
 
+static GList *
+parole_media_list_path_to_row_list (GList *path_list, GtkTreeModel *model)
+{
+    GList *row_list = NULL;
+    guint len, i;
+    
+    len = g_list_length (path_list);
+    
+    for ( i = 0; i < len; i++)
+    {
+	GtkTreePath *path;
+	GtkTreeRowReference *row;
+	
+	path = g_list_nth_data (path_list, i);
+	
+	row = gtk_tree_row_reference_new (model, path);
+	path = gtk_tree_row_reference_get_path (row);
+	row_list = g_list_append (row_list, row);
+    }
+    
+    return row_list;
+}
+
 void
 parole_media_list_remove_clicked_cb (GtkButton *button, ParoleMediaList *list)
 {
-    GtkTreeSelection *sel;
+    GtkTreeModel *model;
+    GList *path_list = NULL;
+    GList *row_list = NULL;
     GtkTreeIter iter;
     gint nch;
+    guint len, i;
     
-    sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
+    path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model);
+	
+    row_list = parole_media_list_path_to_row_list (path_list, model);
     
-    if ( !gtk_tree_selection_get_selected (sel, NULL, &iter) )
-	return;
-	
-    gtk_list_store_remove (list->priv->store,
-			   &iter);
-
+    g_list_foreach (path_list, (GFunc) gtk_tree_path_free, NULL);
+    g_list_free (path_list);
+    
+    len = g_list_length (row_list);
+    
+    for ( i = 0; i < len; i++)
+    {
+	GtkTreePath *path;
+	GtkTreeRowReference *row;
+	row = g_list_nth_data (row_list, i);
+	path = gtk_tree_row_reference_get_path (row);
+    
+	if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path) == TRUE ) )
+	{
+	    gtk_list_store_remove (GTK_LIST_STORE (model),
+				   &iter);
+	}
+    }
+    
+    g_list_foreach (row_list, (GFunc) gtk_tree_row_reference_free, NULL);
+    g_list_free (row_list);
+    
     /*
      * Returns the number of children that iter has. 
      * As a special case, if iter is NULL, 
      * then the number of toplevel nodes is returned. Gtk API doc.
      */
     nch = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (list->priv->store), NULL); 
+    
     if ( nch == 0)
     {
 	parole_media_list_set_widget_sensitive (list, FALSE);
@@ -540,74 +618,178 @@
     }
 }
 
-void
-parole_media_list_media_down_clicked_cb (GtkButton *button, ParoleMediaList *list)
+static void
+parole_media_list_move_one_down (GtkListStore *store, GtkTreeIter *iter)
 {
-    GtkTreeSelection *sel;
-    GtkTreeIter iter;
     GtkTreeIter *pos_iter;
     
-    sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
-    
-    if ( !gtk_tree_selection_get_selected (sel, NULL, &iter) )
-	return;
-    
     /* Save the selected iter to the selected row */
-    pos_iter = gtk_tree_iter_copy (&iter);
+    pos_iter = gtk_tree_iter_copy (iter);
 
     /* We are on the last node in the list!*/
-    if ( !gtk_tree_model_iter_next (GTK_TREE_MODEL (list->priv->store), &iter) )
+    if ( !gtk_tree_model_iter_next (GTK_TREE_MODEL (store), iter) )
     {
 	/* Return false if tree is empty*/
-	if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list->priv->store), &iter))
+	if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), iter))
 	{
-	    gtk_list_store_move_before (GTK_LIST_STORE (list->priv->store), pos_iter, &iter);
+	    gtk_list_store_move_before (GTK_LIST_STORE (store), pos_iter, iter);
 	}
     }
     else
     {
-	gtk_list_store_move_after (GTK_LIST_STORE (list->priv->store), pos_iter, &iter);
+	gtk_list_store_move_after (GTK_LIST_STORE (store), pos_iter, iter);
     }
     
     gtk_tree_iter_free (pos_iter);
 }
 
+static void
+parole_media_list_move_many_down (GList *path_list, GtkTreeModel *model)
+{
+    GList *row_list = NULL;
+    GtkTreeIter iter;
+    guint len;
+    guint i;
+    
+    row_list = parole_media_list_path_to_row_list (path_list, model);
+    
+    len = g_list_length (row_list);
+    
+    for ( i = 0; i < len; i++)
+    {
+	GtkTreeRowReference *row;
+	GtkTreePath *path;
+	
+	row = g_list_nth_data (row_list, i);
+	
+	path = gtk_tree_row_reference_get_path (row);
+	
+	if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path) ) )
+	{
+	    parole_media_list_move_one_down (GTK_LIST_STORE (model), &iter);
+	}
+    }
+    
+    g_list_foreach (row_list, (GFunc) gtk_tree_row_reference_free, NULL);
+    g_list_free (row_list);
+}
+
 void
-parole_media_list_media_up_clicked_cb (GtkButton *button, ParoleMediaList *list)
+parole_media_list_media_down_clicked_cb (GtkButton *button, ParoleMediaList *list)
 {
-    GtkTreeSelection *sel;
     GtkTreeIter iter;
+    GList *path_list = NULL;
+    GtkTreeModel *model;
+    guint len;
+    
+    path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model);
+
+    len = g_list_length (path_list);
+
+    if ( len == 1 )
+    {
+	GtkTreePath *path;
+	path = g_list_nth_data (path_list, 0);
+	if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path)) )
+	    parole_media_list_move_one_down (list->priv->store, &iter);
+    }
+    else
+    {
+	parole_media_list_move_many_down (path_list, model);
+    }
+    
+    g_list_foreach (path_list, (GFunc) gtk_tree_path_free, NULL);
+    g_list_free (path_list);
+}
+
+static void
+parole_media_list_move_one_up (GtkListStore *store, GtkTreeIter *iter)
+{
     GtkTreePath *path;
     GtkTreeIter *pos_iter;
     
-    sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
-    
-    if ( !gtk_tree_selection_get_selected (sel, NULL, &iter) )
-	return;
-	
     /* Save the selected iter to the selected row */
-    pos_iter = gtk_tree_iter_copy (&iter);
+    pos_iter = gtk_tree_iter_copy (iter);
     
-    path = gtk_tree_model_get_path (GTK_TREE_MODEL (list->priv->store), &iter);
+    path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter);
     
     /* We are on the top of the list */
     if ( !gtk_tree_path_prev (path) )
     {
 	/* Passing NULL as the last argument will cause this call to move 
 	 * the iter to the end of the list, Gtk API doc*/
-	gtk_list_store_move_before (GTK_LIST_STORE (list->priv->store), &iter, NULL);
+	gtk_list_store_move_before (GTK_LIST_STORE (store), iter, NULL);
     }
     else
     {
-	if (gtk_tree_model_get_iter (GTK_TREE_MODEL (list->priv->store), &iter, path))
-	    gtk_list_store_move_before (GTK_LIST_STORE (list->priv->store), pos_iter, &iter);
+	if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), iter, path))
+	    gtk_list_store_move_before (GTK_LIST_STORE (store), pos_iter, iter);
     }
     
     gtk_tree_path_free (path);
     gtk_tree_iter_free (pos_iter);
 }
 
+static void
+parole_media_list_move_many_up (GList *path_list, GtkTreeModel *model)
+{
+    GList *row_list = NULL;
+    GtkTreeIter iter;
+    guint len;
+    guint i;
+    
+    row_list = parole_media_list_path_to_row_list (path_list, model);
+    
+    len = g_list_length (row_list);
+    
+    for ( i = 0; i < len; i++)
+    {
+	GtkTreeRowReference *row;
+	GtkTreePath *path;
+	
+	row = g_list_nth_data (row_list, i);
+	
+	path = gtk_tree_row_reference_get_path (row);
+	
+	if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path) ) )
+	{
+	    parole_media_list_move_one_up (GTK_LIST_STORE (model), &iter);
+	}
+    }
+    
+    g_list_foreach (row_list, (GFunc) gtk_tree_row_reference_free, NULL);
+    g_list_free (row_list);
+}
+
 void
+parole_media_list_media_up_clicked_cb (GtkButton *button, ParoleMediaList *list)
+{
+    GtkTreeIter iter;
+    GList *path_list = NULL;
+    GtkTreeModel *model;
+    guint len;
+    
+    path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model);
+
+    len = g_list_length (path_list);
+
+    if ( len == 1 )
+    {
+	GtkTreePath *path;
+	path = g_list_nth_data (path_list, 0);
+	if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path)) )
+	    parole_media_list_move_one_up (list->priv->store, &iter);
+    }
+    else
+    {
+	parole_media_list_move_many_up (path_list, model);
+    }
+    
+    g_list_foreach (path_list, (GFunc) gtk_tree_path_free, NULL);
+    g_list_free (path_list);
+}
+
+void
 parole_media_list_row_activated_cb (GtkTreeView *view, GtkTreePath *path, 
 				    GtkTreeViewColumn *col, ParoleMediaList *list)
 {
@@ -622,22 +804,11 @@
     g_signal_emit (G_OBJECT (list), signals [MEDIA_ACTIVATED], 0, row);
 }
 
-void
-parole_media_list_cursor_changed_cb (GtkTreeView *view, ParoleMediaList *list)
+static void
+parole_media_list_selection_changed_cb (GtkTreeSelection *sel, ParoleMediaList *list)
 {
-    GtkTreeSelection *sel;
-    GtkTreeIter iter;
-    
-    sel = gtk_tree_view_get_selection (view);
-    
-    if ( !gtk_tree_selection_get_selected (sel, NULL, &iter ) )
-    {
-	g_signal_emit (G_OBJECT (list), signals [MEDIA_CURSOR_CHANGED], 0, FALSE);
-    }
-    else
-    {
-	g_signal_emit (G_OBJECT (list), signals [MEDIA_CURSOR_CHANGED], 0, TRUE);
-    }
+    g_signal_emit (G_OBJECT (list), signals [MEDIA_CURSOR_CHANGED], 0,
+		   gtk_tree_selection_count_selected_rows (sel) > 0); 
 }
 
 static void
@@ -715,10 +886,7 @@
 static void
 parole_media_list_select_path (ParoleMediaList *list, GtkTreePath *path)
 {
-    GtkTreeSelection *sel;
-    
-    sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
-    gtk_tree_selection_select_path (sel, path);
+    gtk_tree_selection_select_path (list->priv->sel, path);
     gtk_tree_view_set_cursor (GTK_TREE_VIEW (list->priv->view), path, NULL, FALSE);
 }
 
@@ -791,6 +959,7 @@
 static void
 parole_media_list_setup_view (ParoleMediaList *list)
 {
+    GtkTreeSelection *sel;
     GtkListStore *list_store;
     GtkTreeViewColumn *col;
     GtkCellRenderer *renderer;
@@ -821,6 +990,12 @@
     gtk_drag_dest_set (list->priv->view, GTK_DEST_DEFAULT_ALL, target_entry, G_N_ELEMENTS (target_entry),
                        GDK_ACTION_COPY | GDK_ACTION_MOVE);
     
+    list->priv->sel = sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
+    gtk_tree_selection_set_mode (sel, GTK_SELECTION_MULTIPLE);
+    
+    g_signal_connect (sel, "changed",
+		      G_CALLBACK (parole_media_list_selection_changed_cb), list);
+    
     list->priv->store = list_store;
 }
 
@@ -837,6 +1012,7 @@
     builder = parole_builder_new_from_string (playlist_ui, playlist_ui_length);
     
     list->priv->view = GTK_WIDGET (gtk_builder_get_object (builder, "media-list"));
+    
     box = GTK_WIDGET (gtk_builder_get_object (builder, "playlist-box"));
     
     parole_media_list_setup_view (list);
@@ -974,16 +1150,7 @@
 
 GtkTreeRowReference *parole_media_list_get_selected_row (ParoleMediaList *list)
 {
-    GtkTreeModel *model;
-    GtkTreeSelection *sel;
-    GtkTreeIter iter;
-    
-    sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
-    
-    if (!gtk_tree_selection_get_selected (sel, &model, &iter))
-	return NULL;
-    
-    return parole_media_list_get_row_reference_from_iter (list, &iter, TRUE);
+    return parole_media_list_get_first_selected_row (list);
 }
 
 void parole_media_list_set_row_pixbuf  (ParoleMediaList *list, GtkTreeRowReference *row, GdkPixbuf *pix)

Modified: parole/trunk/parole/parole-player.c
===================================================================
--- parole/trunk/parole/parole-player.c	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-player.c	2009-08-11 09:39:03 UTC (rev 7906)
@@ -881,6 +881,7 @@
 	gtk_widget_reparent (player->priv->play_box, player->priv->control);
 	gtk_widget_hide (player->priv->fs_window);
 	parole_statusbar_set_visible (player->priv->status, TRUE);
+	parole_disc_menu_set_fullscreen (player->priv->disc_menu, FALSE);
 	gtk_widget_show (player->priv->play_box);
 	gtk_widget_show (player->priv->menu_bar);
 	gtk_widget_show (player->priv->playlist_nt);
@@ -895,6 +896,7 @@
     }
     else
     {
+	parole_disc_menu_set_fullscreen (player->priv->disc_menu, TRUE);
 	parole_player_move_fs_window (player);
 	gtk_widget_reparent (player->priv->play_box, player->priv->fs_window);
 	
@@ -908,6 +910,7 @@
 	
 	current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (player->priv->playlist_nt));
 	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (player->priv->main_nt), FALSE);
+	
 	gtk_window_fullscreen (GTK_WINDOW (player->priv->window));
 	player->priv->full_screen = TRUE;
     }
@@ -1244,7 +1247,12 @@
 parole_player_key_press (GtkWidget *widget, GdkEventKey *ev, ParolePlayer *player)
 {
     gboolean ret_val = FALSE;
-    
+/*
+    gchar *key;
+    key = gdk_keyval_name (ev->keyval);
+    g_print ("Key Press 0x%X:%s on widget=%s\n", ev->keyval, key, gtk_widget_get_name (widget));
+*/
+
     switch (ev->keyval)
     {
 	case GDK_F11:
@@ -1270,12 +1278,14 @@
 		parole_player_seekb_cb (NULL, player);
 	    ret_val = TRUE;
 	    break;
+	case GDK_space:
+	    parole_player_play_pause_clicked (NULL, player);
+	    ret_val = TRUE;
+	    break;
 	default:
 	    break;
     }
     
-    g_print ("Key Press 0x%X\n", ev->keyval);
-    
     return ret_val;
 }
 
@@ -1429,6 +1439,11 @@
     g_signal_connect (G_OBJECT (player->priv->gst), "motion-notify-event",
 		      G_CALLBACK (parole_player_gst_widget_motion_notify_event), player);
     
+    /*
+    g_signal_connect (G_OBJECT (player->priv->gst), "key-press-event",
+		      G_CALLBACK (parole_player_key_press), player);
+    */
+    
     player->priv->window = GTK_WIDGET (gtk_builder_get_object (builder, "main-window"));
     player->priv->main_nt = GTK_WIDGET (gtk_builder_get_object (builder, "main-notebook"));
     

Modified: parole/trunk/parole/parole-utils.c
===================================================================
--- parole/trunk/parole/parole-utils.c	2009-08-09 15:47:54 UTC (rev 7905)
+++ parole/trunk/parole/parole-utils.c	2009-08-11 09:39:03 UTC (rev 7906)
@@ -312,6 +312,8 @@
     file = g_file_new_for_commandline_arg (uri);
     parent = g_file_get_parent (file);
     
+    TRACE ("uri : %s", uri);
+    
     if ( !parent )
     {
 	g_object_unref (file);




More information about the Goodies-commits mailing list