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

Ali Abdallah aliov at xfce.org
Tue Jul 28 13:17:48 CEST 2009


Author: aliov
Date: 2009-07-28 11:17:48 +0000 (Tue, 28 Jul 2009)
New Revision: 7854

Modified:
   parole/trunk/ChangeLog
   parole/trunk/TODO
   parole/trunk/data/interfaces/parole.ui
   parole/trunk/data/interfaces/plugins.ui
   parole/trunk/parole/parole-conf.c
   parole/trunk/parole/parole-gst.c
   parole/trunk/parole/parole-medialist.c
   parole/trunk/parole/parole-medialist.h
   parole/trunk/parole/parole-player.c
Log:
	* Implement shuffle and repeat mode.
	* Only hide cursor when we are playing a video.
	* Better full screen support.
	* Change popup size on screen size change in fullscreen mode.

Modified: parole/trunk/ChangeLog
===================================================================
--- parole/trunk/ChangeLog	2009-07-28 07:57:58 UTC (rev 7853)
+++ parole/trunk/ChangeLog	2009-07-28 11:17:48 UTC (rev 7854)
@@ -1,4 +1,10 @@
-2009-07-28: Ali aliov at xfce.org
+2009-07-28: 13:00 Ali aliov at xfce.org
+	* Implement shuffle and repeat mode.
+	* Only hide cursor when we are playing a video.
+	* Better full screen support.
+	* Change popup size on screen size change in fullscreen mode.
+
+2009-07-28: 10:00 Ali aliov at xfce.org
 	* tray-icon plugin: Show the base filename if we don't have
 	the tag title.
 	* main.c: Added show_version function+reorder calls of gst_init and

Modified: parole/trunk/TODO
===================================================================
--- parole/trunk/TODO	2009-07-28 07:57:58 UTC (rev 7853)
+++ parole/trunk/TODO	2009-07-28 11:17:48 UTC (rev 7854)
@@ -1,10 +1,10 @@
 === Media player ===
 * Brightness and contrast support.
 * Complete the shortcut keys.
-* Repeat and Shuffle mode.
+* Seek media on button release event on the range.
 * Better support for cdda.
 * Move to next chapter in movie.
-* Probably something like totem-fullscreen?
+* Support some aspect ratio view.
 * Handle missing gstreamer plugins.
 * Support some playlist title entity.
 * ...

Modified: parole/trunk/data/interfaces/parole.ui
===================================================================
--- parole/trunk/data/interfaces/parole.ui	2009-07-28 07:57:58 UTC (rev 7853)
+++ parole/trunk/data/interfaces/parole.ui	2009-07-28 11:17:48 UTC (rev 7854)
@@ -71,6 +71,27 @@
                   <object class="GtkMenu" id="menu4">
                     <property name="visible">True</property>
                     <child>
+                      <object class="GtkCheckMenuItem" id="repeat">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Repeat</property>
+                        <property name="use_underline">True</property>
+                        <signal name="toggled" handler="parole_player_repeat_toggled_cb"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkCheckMenuItem" id="shuffle">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Shuffle</property>
+                        <property name="use_underline">True</property>
+                        <signal name="toggled" handler="parole_player_shuffle_toggled_cb"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkSeparatorMenuItem" id="separatormenuitem2">
+                        <property name="visible">True</property>
+                      </object>
+                    </child>
+                    <child>
                       <object class="GtkMenuItem" id="plugins-menu-item">
                         <property name="visible">True</property>
                         <property name="label" translatable="yes">Plugins</property>
@@ -174,109 +195,50 @@
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkVBox" id="play-box">
+                              <object class="GtkVBox" id="control">
                                 <property name="visible">True</property>
                                 <property name="orientation">vertical</property>
-                                <property name="spacing">5</property>
                                 <child>
-                                  <object class="GtkHScale" id="scale">
+                                  <object class="GtkVBox" id="play-box">
                                     <property name="visible">True</property>
-                                    <property name="sensitive">False</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="draw_value">False</property>
-                                    <signal name="button_press_event" handler="parole_player_range_button_press"/>
-                                    <signal name="value_changed" handler="parole_player_range_value_changed"/>
-                                    <signal name="button_release_event" handler="parole_player_range_button_release"/>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkHBox" id="hbox7">
-                                    <property name="visible">True</property>
+                                    <property name="orientation">vertical</property>
+                                    <property name="spacing">5</property>
                                     <child>
-                                      <object class="GtkVBox" id="vbox6">
+                                      <object class="GtkHScale" id="scale">
                                         <property name="visible">True</property>
-                                        <property name="orientation">vertical</property>
-                                        <property name="spacing">5</property>
+                                        <property name="sensitive">False</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="draw_value">False</property>
+                                        <signal name="button_press_event" handler="parole_player_range_button_press"/>
+                                        <signal name="value_changed" handler="parole_player_range_value_changed"/>
+                                        <signal name="button_release_event" handler="parole_player_range_button_release"/>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkHBox" id="hbox7">
+                                        <property name="visible">True</property>
                                         <child>
-                                          <object class="GtkHBox" id="hbox6">
+                                          <object class="GtkVBox" id="vbox6">
                                             <property name="visible">True</property>
+                                            <property name="orientation">vertical</property>
                                             <property name="spacing">5</property>
                                             <child>
-                                              <object class="GtkButton" id="back">
+                                              <object class="GtkHBox" id="hbox6">
                                                 <property name="visible">True</property>
-                                                <property name="sensitive">False</property>
-                                                <property name="can_focus">True</property>
-                                                <property name="receives_default">True</property>
-                                                <property name="image">image6</property>
-                                                <property name="relief">none</property>
-                                                <property name="focus_on_click">False</property>
-                                              </object>
-                                              <packing>
-                                                <property name="expand">False</property>
-                                                <property name="position">0</property>
-                                              </packing>
-                                            </child>
-                                            <child>
-                                              <object class="GtkButton" id="stop">
-                                                <property name="visible">True</property>
-                                                <property name="sensitive">False</property>
-                                                <property name="can_focus">True</property>
-                                                <property name="receives_default">True</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>
-                                                <property name="expand">False</property>
-                                                <property name="position">1</property>
-                                              </packing>
-                                            </child>
-                                            <child>
-                                              <object class="GtkButton" id="play-pause">
-                                                <property name="visible">True</property>
-                                                <property name="sensitive">False</property>
-                                                <property name="can_focus">True</property>
-                                                <property name="receives_default">True</property>
-                                                <property name="image">image8</property>
-                                                <property name="relief">none</property>
-                                                <property name="focus_on_click">False</property>
-                                                <accelerator key="space" signal="activate"/>
-                                                <signal name="clicked" handler="parole_player_play_pause_clicked"/>
-                                              </object>
-                                              <packing>
-                                                <property name="expand">False</property>
-                                                <property name="position">2</property>
-                                              </packing>
-                                            </child>
-                                            <child>
-                                              <object class="GtkButton" id="forward">
-                                                <property name="visible">True</property>
-                                                <property name="sensitive">False</property>
-                                                <property name="can_focus">True</property>
-                                                <property name="receives_default">True</property>
-                                                <property name="image">image9</property>
-                                                <property name="relief">none</property>
-                                                <property name="focus_on_click">False</property>
-                                              </object>
-                                              <packing>
-                                                <property name="expand">False</property>
-                                                <property name="position">3</property>
-                                              </packing>
-                                            </child>
-                                            <child>
-                                              <object class="GtkHBox" id="hbox8">
-                                                <property name="visible">True</property>
                                                 <property name="spacing">5</property>
                                                 <child>
-                                                  <object class="GtkImage" id="volume-image">
+                                                  <object class="GtkButton" id="back">
                                                     <property name="visible">True</property>
-                                                    <property name="stock">gtk-missing-image</property>
+                                                    <property name="sensitive">False</property>
+                                                    <property name="can_focus">True</property>
+                                                    <property name="receives_default">True</property>
+                                                    <property name="image">image6</property>
+                                                    <property name="relief">none</property>
+                                                    <property name="focus_on_click">False</property>
                                                   </object>
                                                   <packing>
                                                     <property name="expand">False</property>
@@ -284,25 +246,93 @@
                                                   </packing>
                                                 </child>
                                                 <child>
-                                                  <object class="GtkHScale" id="volume">
-                                                    <property name="width_request">100</property>
-                                                    <property name="height_request">10</property>
+                                                  <object class="GtkButton" id="stop">
                                                     <property name="visible">True</property>
+                                                    <property name="sensitive">False</property>
                                                     <property name="can_focus">True</property>
-                                                    <property name="show_fill_level">True</property>
-                                                    <property name="draw_value">False</property>
-                                                    <signal name="value_changed" handler="parole_player_volume_value_changed_cb"/>
+                                                    <property name="receives_default">True</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>
                                                     <property name="expand">False</property>
                                                     <property name="position">1</property>
                                                   </packing>
                                                 </child>
+                                                <child>
+                                                  <object class="GtkButton" id="play-pause">
+                                                    <property name="visible">True</property>
+                                                    <property name="sensitive">False</property>
+                                                    <property name="can_focus">True</property>
+                                                    <property name="receives_default">True</property>
+                                                    <property name="image">image8</property>
+                                                    <property name="relief">none</property>
+                                                    <property name="focus_on_click">False</property>
+                                                    <accelerator key="space" signal="activate"/>
+                                                    <signal name="clicked" handler="parole_player_play_pause_clicked"/>
+                                                  </object>
+                                                  <packing>
+                                                    <property name="expand">False</property>
+                                                    <property name="position">2</property>
+                                                  </packing>
+                                                </child>
+                                                <child>
+                                                  <object class="GtkButton" id="forward">
+                                                    <property name="visible">True</property>
+                                                    <property name="sensitive">False</property>
+                                                    <property name="can_focus">True</property>
+                                                    <property name="receives_default">True</property>
+                                                    <property name="image">image9</property>
+                                                    <property name="relief">none</property>
+                                                    <property name="focus_on_click">False</property>
+                                                  </object>
+                                                  <packing>
+                                                    <property name="expand">False</property>
+                                                    <property name="position">3</property>
+                                                  </packing>
+                                                </child>
+                                                <child>
+                                                  <object class="GtkHBox" id="hbox8">
+                                                    <property name="visible">True</property>
+                                                    <property name="spacing">5</property>
+                                                    <child>
+                                                      <object class="GtkImage" id="volume-image">
+                                                        <property name="visible">True</property>
+                                                        <property name="stock">gtk-missing-image</property>
+                                                      </object>
+                                                      <packing>
+                                                        <property name="expand">False</property>
+                                                        <property name="position">0</property>
+                                                      </packing>
+                                                    </child>
+                                                    <child>
+                                                      <object class="GtkHScale" id="volume">
+                                                        <property name="width_request">100</property>
+                                                        <property name="height_request">10</property>
+                                                        <property name="visible">True</property>
+                                                        <property name="can_focus">True</property>
+                                                        <property name="show_fill_level">True</property>
+                                                        <property name="draw_value">False</property>
+                                                        <signal name="value_changed" handler="parole_player_volume_value_changed_cb"/>
+                                                      </object>
+                                                      <packing>
+                                                        <property name="expand">False</property>
+                                                        <property name="position">1</property>
+                                                      </packing>
+                                                    </child>
+                                                  </object>
+                                                  <packing>
+                                                    <property name="padding">30</property>
+                                                    <property name="pack_type">end</property>
+                                                    <property name="position">4</property>
+                                                  </packing>
+                                                </child>
                                               </object>
                                               <packing>
-                                                <property name="padding">30</property>
-                                                <property name="pack_type">end</property>
-                                                <property name="position">4</property>
+                                                <property name="position">0</property>
                                               </packing>
                                             </child>
                                           </object>
@@ -310,30 +340,46 @@
                                             <property name="position">0</property>
                                           </packing>
                                         </child>
+                                        <child>
+                                          <object class="GtkButton" id="leave_fs">
+                                            <property name="label" translatable="yes">gtk-leave-fullscreen</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="no_show_all">True</property>
+                                            <property name="use_stock">True</property>
+                                            <signal name="clicked" handler="parole_player_leave_fs_cb"/>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="position">2</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkButton" id="show-hide-list">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <property name="no_show_all">True</property>
+                                            <property name="image">image18</property>
+                                            <signal name="clicked" handler="parole_player_show_hide_playlist"/>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="pack_type">end</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
                                       </object>
                                       <packing>
-                                        <property name="position">0</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkButton" id="show-hide-list">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="receives_default">True</property>
-                                        <property name="image">image18</property>
-                                        <signal name="clicked" handler="parole_player_show_hide_playlist"/>
-                                      </object>
-                                      <packing>
                                         <property name="expand">False</property>
-                                        <property name="fill">False</property>
-                                        <property name="pack_type">end</property>
                                         <property name="position">1</property>
                                       </packing>
                                     </child>
                                   </object>
                                   <packing>
                                     <property name="expand">False</property>
-                                    <property name="position">1</property>
+                                    <property name="position">0</property>
                                   </packing>
                                 </child>
                               </object>

Modified: parole/trunk/data/interfaces/plugins.ui
===================================================================
--- parole/trunk/data/interfaces/plugins.ui	2009-07-28 07:57:58 UTC (rev 7853)
+++ parole/trunk/data/interfaces/plugins.ui	2009-07-28 11:17:48 UTC (rev 7854)
@@ -239,6 +239,7 @@
                     </child>
                   </object>
                   <packing>
+                    <property name="expand">False</property>
                     <property name="position">1</property>
                   </packing>
                 </child>

Modified: parole/trunk/parole/parole-conf.c
===================================================================
--- parole/trunk/parole/parole-conf.c	2009-07-28 07:57:58 UTC (rev 7853)
+++ parole/trunk/parole/parole-conf.c	2009-07-28 11:17:48 UTC (rev 7854)
@@ -41,6 +41,9 @@
     gboolean	 enable_subtitle;
     gchar	*subtitle_font;
     gchar       *subtitle_encoding;
+    
+    gboolean     repeat;
+    gboolean     shuffle;
 };
 
 static gpointer parole_conf_object = NULL;
@@ -54,7 +57,9 @@
     PROP_VIS_NAME,
     PROP_SUBTITLE_ENABLED,
     PROP_SUBTITLE_FONT,
-    PROP_SUBTITLE_ENCODING
+    PROP_SUBTITLE_ENCODING,
+    PROP_REPEAT,
+    PROP_SHUFFLE
 };
 
 static void parole_conf_set_property (GObject *object,
@@ -98,6 +103,16 @@
 	    g_object_notify (G_OBJECT (conf), "subtitle-font");
 	    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);
+	    g_object_notify (G_OBJECT (conf), "repeat");
+	    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);
+	    g_object_notify (G_OBJECT (conf), "shuffle");
+	    parole_rc_write_entry_bool ("SHUFFLE", PAROLE_RC_GROUP_GENERAL, conf->priv->shuffle);
+	    break;
         default:
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
             break;
@@ -129,6 +144,12 @@
 	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;
 	default:
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
             break;
@@ -144,6 +165,7 @@
     
     g_free (conf->priv->vis_sink);
     g_free (conf->priv->subtitle_font);
+    g_free (conf->priv->subtitle_encoding);
 
     G_OBJECT_CLASS (parole_conf_parent_class)->finalize (object);
 }
@@ -193,6 +215,20 @@
                                                            NULL,
                                                            G_PARAM_READWRITE));
     
+    g_object_class_install_property (object_class,
+                                     PROP_REPEAT,
+                                     g_param_spec_boolean ("repeat",
+                                                           NULL, NULL,
+                                                           FALSE,
+                                                           G_PARAM_READWRITE));
+    
+    g_object_class_install_property (object_class,
+                                     PROP_SHUFFLE,
+                                     g_param_spec_boolean ("shuffle",
+                                                           NULL, NULL,
+                                                           FALSE,
+                                                           G_PARAM_READWRITE));
+    
     g_type_class_add_private (klass, sizeof (ParoleConfPrivate));
 }
 
@@ -206,6 +242,8 @@
     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);
 }
 
 ParoleConf *

Modified: parole/trunk/parole/parole-gst.c
===================================================================
--- parole/trunk/parole/parole-gst.c	2009-07-28 07:57:58 UTC (rev 7853)
+++ parole/trunk/parole/parole-gst.c	2009-07-28 11:17:48 UTC (rev 7854)
@@ -325,9 +325,14 @@
     gint64 pos;
     GstFormat format = GST_FORMAT_TIME;
     gdouble value;
+    gboolean video;
     
     gst = PAROLE_GST (data);
     
+    g_object_get (G_OBJECT (gst->priv->stream),
+		  "has-video", &video,
+		  NULL);
+    
     gst_element_query_position (gst->priv->playbin, &format, &pos);
     
     if ( G_UNLIKELY (format != GST_FORMAT_TIME ) )
@@ -340,7 +345,7 @@
     }
 
 out:
-    if ( g_timer_elapsed (gst->priv->hidecursor_timer, NULL ) > HIDE_WINDOW_CURSOR_TIMEOUT )
+    if ( g_timer_elapsed (gst->priv->hidecursor_timer, NULL ) > HIDE_WINDOW_CURSOR_TIMEOUT && video)
 	parole_gst_set_cursor_visible (gst, FALSE);
 	
     return TRUE;

Modified: parole/trunk/parole/parole-medialist.c
===================================================================
--- parole/trunk/parole/parole-medialist.c	2009-07-28 07:57:58 UTC (rev 7853)
+++ parole/trunk/parole/parole-medialist.c	2009-07-28 11:17:48 UTC (rev 7854)
@@ -682,6 +682,33 @@
 }
 
 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_view_set_cursor (GTK_TREE_VIEW (list->priv->view), path, NULL, FALSE);
+}
+
+static GtkTreeRowReference *
+parole_media_list_get_row_reference_from_iter (ParoleMediaList *list, GtkTreeIter *iter, gboolean select_path)
+{
+    GtkTreePath *path;
+    GtkTreeRowReference *row;
+    
+    path = gtk_tree_model_get_path (GTK_TREE_MODEL (list->priv->store), iter);
+    row = gtk_tree_row_reference_new (GTK_TREE_MODEL (list->priv->store), path);
+    
+    if ( select_path)
+	parole_media_list_select_path (list, path);
+    
+    gtk_tree_path_free (path);
+    
+    return row;
+}
+
+static void
 parole_media_list_finalize (GObject *object)
 {
     ParoleMediaList *list;
@@ -819,9 +846,11 @@
  * Public functions.
  * 
  */
-GtkTreeRowReference *parole_media_list_get_next_row (ParoleMediaList *list, GtkTreeRowReference *row)
+GtkTreeRowReference *parole_media_list_get_next_row (ParoleMediaList *list, 
+						     GtkTreeRowReference *row,
+						     gboolean repeat)
 {
-    GtkTreeRowReference *next;
+    GtkTreeRowReference *next = NULL;
     GtkTreePath *path;
     GtkTreeIter iter;
     
@@ -836,21 +865,57 @@
     
     if ( gtk_tree_model_get_iter (GTK_TREE_MODEL (list->priv->store), &iter, path))
     {
-	path = gtk_tree_model_get_path (GTK_TREE_MODEL (list->priv->store), &iter);
 	next = gtk_tree_row_reference_new (GTK_TREE_MODEL (list->priv->store), path);
-	gtk_tree_path_free (path);
-	return next;
+	parole_media_list_select_path (list, path);
     }
+    else if ( repeat ) /* Repeat playing ?*/
+    {
+	if ( gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list->priv->store), &iter))
+	{
+	    next =  parole_media_list_get_row_reference_from_iter (list, &iter, TRUE);
+	}
+    }
     
-    return NULL;
+    gtk_tree_path_free (path);
+    
+    return next;
 }
 
+GtkTreeRowReference *parole_media_list_get_row_random (ParoleMediaList *list)
+{
+    GtkTreeRowReference *row = NULL;
+    GtkTreeIter iter;
+    GtkTreePath *path;
+    gchar *path_str;
+    gint nch;
+
+    nch = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (list->priv->store), NULL);
+    
+    if ( nch == 1 || nch == 0 )
+    {
+	return  NULL;
+    }
+    
+    path_str = g_strdup_printf ("%i", g_random_int_range (0, nch));
+    
+    path = gtk_tree_path_new_from_string (path_str);
+    g_free (path_str);
+    
+    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);
+    
+    return row;
+}
+
 GtkTreeRowReference *parole_media_list_get_selected_row (ParoleMediaList *list)
 {
     GtkTreeModel *model;
-    GtkTreePath	*path;
     GtkTreeSelection *sel;
-    GtkTreeRowReference *row;
     GtkTreeIter iter;
     
     sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (list->priv->view));
@@ -858,13 +923,7 @@
     if (!gtk_tree_selection_get_selected (sel, &model, &iter))
 	return NULL;
     
-    path = gtk_tree_model_get_path (model, &iter);
-    
-    row = gtk_tree_row_reference_new (model, path);
-    
-    gtk_tree_path_free (path);
-
-    return row;
+    return parole_media_list_get_row_reference_from_iter (list, &iter, TRUE);
 }
 
 void parole_media_list_set_row_pixbuf  (ParoleMediaList *list, GtkTreeRowReference *row, GdkPixbuf *pix)

Modified: parole/trunk/parole/parole-medialist.h
===================================================================
--- parole/trunk/parole/parole-medialist.h	2009-07-28 07:57:58 UTC (rev 7853)
+++ parole/trunk/parole/parole-medialist.h	2009-07-28 11:17:48 UTC (rev 7854)
@@ -70,8 +70,11 @@
 GtkTreeRowReference		*parole_media_list_get_selected_row (ParoleMediaList *list);
 
 GtkTreeRowReference             *parole_media_list_get_next_row     (ParoleMediaList *list,
-								     GtkTreeRowReference *row);
+								     GtkTreeRowReference *row,
+								     gboolean repeat);
 
+GtkTreeRowReference		*parole_media_list_get_row_random   (ParoleMediaList *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-07-28 07:57:58 UTC (rev 7853)
+++ parole/trunk/parole/parole-player.c	2009-07-28 11:17:48 UTC (rev 7854)
@@ -69,6 +69,9 @@
 void            parole_player_stop_clicked              (GtkButton *button, 
 							 ParolePlayer *player);
 
+void		parole_player_leave_fs_cb		(GtkButton *button,
+							 ParolePlayer *player);
+
 void            parole_player_destroy_cb                (GtkObject *window, 
 							 ParolePlayer *player);
 
@@ -98,6 +101,12 @@
 void		parole_player_full_screen_activated_cb  (GtkWidget *widget,
 							 ParolePlayer *player);
 
+void		parole_player_shuffle_toggled_cb	(GtkWidget *widget,
+							 ParolePlayer *player);
+
+void		parole_player_repeat_toggled_cb		(GtkWidget *widget,
+							 ParolePlayer *player);
+
 void	        parole_show_about			(GtkWidget *widget);
 
 gboolean	parole_player_key_press 		(GtkWidget *widget, 
@@ -106,9 +115,6 @@
 /*
  * End of GtkBuilder Callbacks
  */
-
-#define INTERFACE_FILE INTERFACES_DIR "/parole.ui"
-
 #define PAROLE_PLAYER_GET_PRIVATE(o) \
 (G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_PLAYER, ParolePlayerPrivate))
 
@@ -118,6 +124,7 @@
     ParoleStatusbar     *status;
     ParoleDisc          *disc;
     ParoleScreenSaver   *screen_saver;
+    ParoleConf          *conf;
 
     GtkWidget 		*gst;
 
@@ -129,6 +136,13 @@
     GtkWidget		*stop;
     GtkWidget		*range;
     
+    GtkWidget		*fs_window; /* Window for packing control widgets 
+				     * when in full screen mode
+				     */
+    GtkWidget		*control; /* contains all play button*/
+    GtkWidget		*leave_fs;
+    
+    
     GtkWidget		*volume;
     GtkWidget		*volume_image;
     GtkWidget		*menu_bar;
@@ -463,13 +477,24 @@
 static void
 parole_player_play_next (ParolePlayer *player)
 {
+    gboolean repeat, shuffle;
+    
     GtkTreeRowReference *row;
     
+    g_object_get (G_OBJECT (player->priv->conf),
+		  "shuffle", &shuffle,
+		  "repeat", &repeat,
+		  NULL);
+    
     if ( player->priv->row )
     {
 	parole_media_list_set_row_pixbuf (player->priv->list, player->priv->row, NULL);
-	row = parole_media_list_get_next_row (player->priv->list, player->priv->row);
 	
+	if ( shuffle )
+	    row = parole_media_list_get_row_random (player->priv->list);
+	else
+	    row = parole_media_list_get_next_row (player->priv->list, player->priv->row, repeat);
+	
 	if ( row )
 	{
 	    parole_player_media_activated_cb (player->priv->list, row, player);
@@ -661,17 +686,43 @@
 }
 
 static void
+parole_player_move_fs_window (ParolePlayer *player)
+{
+    GdkScreen *screen;
+    GdkRectangle rect;
+    
+    screen = gtk_window_get_screen (GTK_WINDOW (player->priv->fs_window));
+    
+    gdk_screen_get_monitor_geometry (screen,
+				     gdk_screen_get_monitor_at_window (screen, player->priv->window->window),
+				     &rect);
+    
+    
+    gtk_window_resize (GTK_WINDOW (player->priv->fs_window), 
+		       rect.width, 
+		       player->priv->play_box->allocation.width);
+    
+    gtk_window_move (GTK_WINDOW (player->priv->fs_window),
+		     0, 
+		     rect.height + rect.y - player->priv->play_box->allocation.height);
+}
+
+static void
 parole_player_full_screen_menu_item_activate (ParolePlayer *player)
 {
     static gint current_page = 0;
     
     if ( player->priv->full_screen )
     {
+	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);
 	gtk_widget_show (player->priv->play_box);
 	gtk_widget_show (player->priv->menu_bar);
 	gtk_widget_show (player->priv->playlist_nt);
 	gtk_widget_show (player->priv->show_hide_playlist);
+	gtk_widget_hide (player->priv->leave_fs);
+	
 	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (player->priv->main_nt), TRUE);
 	gtk_window_unfullscreen (GTK_WINDOW (player->priv->window));
 	gtk_notebook_set_current_page (GTK_NOTEBOOK (player->priv->playlist_nt), current_page);
@@ -679,11 +730,17 @@
     }
     else
     {
+	parole_player_move_fs_window (player);
+	gtk_widget_reparent (player->priv->play_box, player->priv->fs_window);
+	
 	parole_statusbar_set_visible (player->priv->status, FALSE);
+	
 	gtk_widget_hide (player->priv->play_box);
 	gtk_widget_hide (player->priv->menu_bar);
 	gtk_widget_hide (player->priv->playlist_nt);
 	gtk_widget_hide (player->priv->show_hide_playlist);
+	gtk_widget_show (player->priv->leave_fs);
+	
 	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));
@@ -696,6 +753,11 @@
     parole_player_full_screen_menu_item_activate (player);
 }
 
+void parole_player_leave_fs_cb (GtkButton *button, ParolePlayer *player)
+{
+    parole_player_full_screen_menu_item_activate (player);
+}
+
 static void
 parole_player_show_menu (ParolePlayer *player, guint button, guint activate_time)
 {
@@ -786,19 +848,42 @@
     return FALSE;
 }
 
+static gboolean parole_player_hide_fs_window (gpointer data)
+{
+    ParolePlayer *player;
+    
+    player = PAROLE_PLAYER (data);
+    
+    if ( GTK_WIDGET_VISIBLE (player->priv->fs_window) )
+    {
+	gtk_widget_hide (player->priv->fs_window);
+    }
+
+    return FALSE;
+}
+
 static gboolean
 parole_player_gst_widget_motion_notify_event (GtkWidget *widget, GdkEventMotion *ev, ParolePlayer *player)
 {
-    gint pointer_y;
-
+    static gulong hide_timeout = 0;
+    
     if ( player->priv->full_screen )
     {
-	pointer_y = (gint) ev->y;
-	if ( pointer_y >= widget->allocation.height - 10 )
-	    gtk_widget_show (player->priv->play_box);
-	else
-	    gtk_widget_hide (player->priv->play_box);
+	gtk_widget_show_all (player->priv->fs_window);
+	if ( hide_timeout != 0 )
+	{
+	    g_source_remove (hide_timeout);
+	    hide_timeout = 0;
+	}
+	    
+	hide_timeout = g_timeout_add_seconds (4, (GSourceFunc) parole_player_hide_fs_window, player);
     }
+    else if ( hide_timeout != 0)
+    {
+	g_source_remove (hide_timeout);
+	hide_timeout = 0;
+    }
+    
     return FALSE;
 }
 
@@ -829,6 +914,29 @@
     parole_player_delete_event_cb (NULL, NULL, player);
 }
 
+
+void parole_player_shuffle_toggled_cb (GtkWidget *widget, ParolePlayer *player)
+{
+    gboolean toggled;
+    
+    toggled = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget));
+    
+    g_object_set (G_OBJECT (player->priv->conf),
+		  "shuffle", toggled,
+		  NULL);
+}
+
+void parole_player_repeat_toggled_cb (GtkWidget *widget, ParolePlayer *player)
+{
+    gboolean toggled;
+    
+    toggled = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget));
+    
+    g_object_set (G_OBJECT (player->priv->conf),
+		  "repeat", toggled,
+		  NULL);
+}
+
 static const gchar *
 parole_player_get_volume_icon_name (gdouble value)
 {
@@ -875,6 +983,13 @@
 }
 
 static void
+parole_player_screen_size_change_changed_cb (GdkScreen *screen, ParolePlayer *player)
+{
+    if ( player->priv->full_screen )
+	parole_player_move_fs_window (player);
+}
+
+static void
 parole_player_finalize (GObject *object)
 {
     ParolePlayer *player;
@@ -886,7 +1001,10 @@
     g_object_unref (player->priv->gst);
     g_object_unref (player->priv->status);
     g_object_unref (player->priv->disc);
+    g_object_unref (player->priv->conf);
     g_object_unref (player->priv->screen_saver);
+    
+    gtk_widget_destroy (player->priv->fs_window);
 
     G_OBJECT_CLASS (parole_player_parent_class)->finalize (object);
 }
@@ -917,11 +1035,15 @@
 parole_player_init (ParolePlayer *player)
 {
     GtkBuilder *builder;
+    GdkScreen *screen;
+    gboolean repeat, shuffle;
     
     player->priv = PAROLE_PLAYER_GET_PRIVATE (player);
     
     builder = parole_builder_get_main_interface ();
     
+    player->priv->conf = parole_conf_new ();
+    
     player->priv->gst = parole_gst_new ();
     /*
      * Since ParoleGst is derived from GtkWidget and packed in the media output
@@ -984,6 +1106,8 @@
     player->priv->play_box = GTK_WIDGET (gtk_builder_get_object (builder, "play-box"));
     player->priv->playlist_nt = GTK_WIDGET (gtk_builder_get_object (builder, "notebook-playlist"));
     player->priv->show_hide_playlist = GTK_WIDGET (gtk_builder_get_object (builder, "show-hide-list"));
+    player->priv->control = GTK_WIDGET (gtk_builder_get_object (builder, "control"));
+    player->priv->leave_fs = GTK_WIDGET (gtk_builder_get_object (builder, "leave_fs"));
     
     gtk_range_set_range (GTK_RANGE (player->priv->volume), 0, 1.0);
     
@@ -1021,7 +1145,27 @@
     g_signal_connect (player->priv->list, "uri-opened",
 		      G_CALLBACK (parole_player_uri_opened_cb), player);
 
+    g_object_get (G_OBJECT (player->priv->conf),
+		  "repeat", &repeat,
+		  "shuffle", &shuffle,
+		  NULL);
+
+    gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "repeat")),
+				    repeat);
+
+    gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "shuffle")),
+				    shuffle);
+	
+    player->priv->fs_window = gtk_window_new (GTK_WINDOW_POPUP);
+    gtk_window_set_skip_pager_hint (GTK_WINDOW (player->priv->fs_window), TRUE);
+    gtk_window_set_skip_taskbar_hint (GTK_WINDOW (player->priv->fs_window), TRUE);
+	
     gtk_builder_connect_signals (builder, player);
+    
+    screen = gtk_widget_get_screen (player->priv->window);
+    g_signal_connect (G_OBJECT (screen), "size-changed",
+		      G_CALLBACK (parole_player_screen_size_change_changed_cb), player);
+    
     g_object_unref (builder);
 }
 




More information about the Goodies-commits mailing list