[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