[Goodies-commits] r7882 - in parole/trunk: . data/interfaces parole po
Ali Abdallah
aliov at xfce.org
Fri Jul 31 23:33:33 CEST 2009
Author: aliov
Date: 2009-07-31 21:33:33 +0000 (Fri, 31 Jul 2009)
New Revision: 7882
Modified:
parole/trunk/ChangeLog
parole/trunk/TODO
parole/trunk/data/interfaces/mediachooser.ui
parole/trunk/data/interfaces/parole-settings.ui
parole/trunk/data/interfaces/parole.ui
parole/trunk/data/interfaces/save-playlist.ui
parole/trunk/parole/Makefile.am
parole/trunk/parole/main.c
parole/trunk/parole/parole-conf.c
parole/trunk/parole/parole-disc-menu.c
parole/trunk/parole/parole-disc-menu.h
parole/trunk/parole/parole-disc.c
parole/trunk/parole/parole-gst.c
parole/trunk/parole/parole-gst.h
parole/trunk/parole/parole-mediachooser.c
parole/trunk/parole/parole-player.c
parole/trunk/parole/parole-player.h
parole/trunk/parole/parole-rc-utils.c
parole/trunk/parole/parole-rc-utils.h
parole/trunk/parole/parole-stream.c
parole/trunk/parole/parole-stream.h
parole/trunk/parole/parole-utils.c
parole/trunk/po/parole-media-player.pot
Log:
* Support for Recent played media files.
* Better configuration loading based GValues.
* Register posix signal handler.
* Much better cdda support.
* Patch the makefile by Enrico Tr?\195?\182ger to fix issue with
generating the enum types.
* Fix the sound image menu items size.
* Double clicks a file close the media chooser dialog.
* Remove grey border in fullscreen mode.
* Set the main window name to Parole Media Player.
* Fix the expander packing style in the savelist chooser.
Modified: parole/trunk/ChangeLog
===================================================================
--- parole/trunk/ChangeLog 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/ChangeLog 2009-07-31 21:33:33 UTC (rev 7882)
@@ -1,3 +1,16 @@
+2009-07-31: 11:30 Ali aliov at xfce.org
+ * Support for Recent played media files.
+ * Better configuration loading based GValues.
+ * Register posix signal handler.
+ * Much better cdda support.
+ * Patch the makefile by Enrico Tröger to fix issue with
+ generating the enum types.
+ * Fix the sound image menu items size.
+ * Double clicks a file close the media chooser dialog.
+ * Remove grey border in fullscreen mode.
+ * Set the main window name to Parole Media Player.
+ * Fix the expander packing style in the savelist chooser.
+
2009-07-30: Ali aliov at xfce.org
* Supports for Aspect ratio views.
* Remember the size of the main window set.
Modified: parole/trunk/TODO
===================================================================
--- parole/trunk/TODO 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/TODO 2009-07-31 21:33:33 UTC (rev 7882)
@@ -2,7 +2,6 @@
* Complete the shortcut keys.
* Handle missing gstreamer plugins.
* Support scale ratio view.
-* Better support for cdda.
* Support some playlist title entity.
* Use pixel-aspect-ratio info when calculating the
aspect ratio.
Modified: parole/trunk/data/interfaces/mediachooser.ui
===================================================================
--- parole/trunk/data/interfaces/mediachooser.ui 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/data/interfaces/mediachooser.ui 2009-07-31 21:33:33 UTC (rev 7882)
@@ -12,6 +12,7 @@
<property name="border_width">5</property>
<property name="orientation">vertical</property>
<property name="spacing">1</property>
+ <signal name="file_activated" handler="media_chooser_file_activate_cb"/>
<signal name="current_folder_changed" handler="media_chooser_folder_changed_cb"/>
</object>
<packing>
Modified: parole/trunk/data/interfaces/parole-settings.ui
===================================================================
--- parole/trunk/data/interfaces/parole-settings.ui 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/data/interfaces/parole-settings.ui 2009-07-31 21:33:33 UTC (rev 7882)
@@ -22,86 +22,6 @@
<property name="orientation">vertical</property>
<property name="spacing">10</property>
<child>
- <object class="GtkFrame" id="frame1">
- <property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
- <child>
- <object class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <object class="GtkVBox" id="vbox2">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkCheckButton" id="enable-vis">
- <property name="label" translatable="yes">Enable visualization when playing audio file</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">Changing this will take effect after parole is restarted or a new media file is loaded.</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="parole_conf_dialog_enable_vis_changed_cb"/>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox1">
- <property name="visible">True</property>
- <property name="spacing">2</property>
- <child>
- <object class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Visualization type:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBox" id="vis-combobox">
- <property name="visible">True</property>
- <property name="model">liststore1</property>
- <signal name="changed" handler="parole_conf_dialog_vis_plugin_changed_cb"/>
- <child>
- <object class="GtkCellRendererText" id="cellrenderertext1"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes"><b>Audio</b></property>
- <property name="use_markup">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
<object class="GtkFrame" id="frame-display">
<property name="visible">True</property>
<property name="label_xalign">0</property>
@@ -263,6 +183,85 @@
</child>
</object>
<packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkCheckButton" id="enable-vis">
+ <property name="label" translatable="yes">Enable visualization when playing audio file</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="parole_conf_dialog_enable_vis_changed_cb"/>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Visualization type:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="vis-combobox">
+ <property name="visible">True</property>
+ <property name="model">liststore1</property>
+ <signal name="changed" handler="parole_conf_dialog_vis_plugin_changed_cb"/>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Audio</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
<property name="position">1</property>
</packing>
</child>
@@ -282,7 +281,7 @@
<property name="spacing">5</property>
<child>
<object class="GtkCheckButton" id="enable-subtitle">
- <property name="label" translatable="yes">Automatically load subtitle when playing movie file</property>
+ <property name="label" translatable="yes">Automatically load subtitles when playing movie file</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
Modified: parole/trunk/data/interfaces/parole.ui
===================================================================
--- parole/trunk/data/interfaces/parole.ui 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/data/interfaces/parole.ui 2009-07-31 21:33:33 UTC (rev 7882)
@@ -3,6 +3,7 @@
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="main-window">
+ <property name="title" translatable="yes">Parole Media Player</property>
<property name="window_position">center</property>
<property name="default_width">780</property>
<property name="default_height">480</property>
@@ -219,7 +220,7 @@
<object class="GtkMenu" id="menu1">
<property name="visible">True</property>
<child>
- <object class="GtkImageMenuItem" id="imagemenuitem1">
+ <object class="GtkImageMenuItem" id="volume-mute-menu">
<property name="label" translatable="yes">Mute</property>
<property name="visible">True</property>
<property name="image">image12</property>
@@ -227,7 +228,7 @@
</object>
</child>
<child>
- <object class="GtkImageMenuItem" id="imagemenuitem2">
+ <object class="GtkImageMenuItem" id="volume-up-menu">
<property name="label" translatable="yes">Volume Up</property>
<property name="visible">True</property>
<property name="image">image11</property>
@@ -237,7 +238,7 @@
</object>
</child>
<child>
- <object class="GtkImageMenuItem" id="imagemenuitem3">
+ <object class="GtkImageMenuItem" id="volume-down-menu">
<property name="label" translatable="yes">Volume Down</property>
<property name="visible">True</property>
<property name="image">image10</property>
@@ -286,6 +287,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="show_tabs">False</property>
+ <property name="show_border">False</property>
<property name="scrollable">True</property>
<property name="group_id">0</property>
<child>
@@ -378,14 +380,19 @@
</packing>
</child>
<child>
- <placeholder/>
+ <object class="GtkEventBox" id="eventboxinfo">
+ <property name="no_show_all">True</property>
+ <child>
+ <object class="GtkLabel" id="info">
+ <property name="no_show_all">True</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
</child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
</object>
<packing>
<property name="expand">False</property>
Modified: parole/trunk/data/interfaces/save-playlist.ui
===================================================================
--- parole/trunk/data/interfaces/save-playlist.ui 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/data/interfaces/save-playlist.ui 2009-07-31 21:33:33 UTC (rev 7882)
@@ -21,8 +21,6 @@
</object>
<object class="GtkFileChooserDialog" id="filechooserdialog">
<property name="border_width">5</property>
- <property name="default_width">480</property>
- <property name="default_height">300</property>
<property name="type_hint">normal</property>
<property name="has_separator">False</property>
<property name="action">save</property>
@@ -74,6 +72,8 @@
</child>
</object>
<packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
Modified: parole/trunk/parole/Makefile.am
===================================================================
--- parole/trunk/parole/Makefile.am 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/Makefile.am 2009-07-31 21:33:33 UTC (rev 7882)
@@ -10,18 +10,11 @@
-DLOCALEDIR=\"$(localedir)\" \
-DG_LOG_DOMAIN=\"parole\" \
-DPAROLE_PLUGINS_DIR=\"$(libdir)/parole-$(PAROLE_VERSION_API)\"\
- $(GTK_CFLAGS) \
- $(GLIB_CFLAGS) \
- $(GOBJECT_CFLAGS) \
$(GTHREAD_CFLAGS) \
$(GIO_CFLAGS) \
- $(DBUS_CFLAGS) \
$(DBUS_GLIB_CFLAGS) \
$(LIBXFCE4GUI_CFLAGS) \
- $(LIBXFCE4UTIL_CFLAGS) \
- $(GST_CFLAGS) \
$(GST_VIDEO_CFLAGS) \
- $(GST_BASE_CFLAGS) \
$(GST_INTERFACES_CFLAGS)
PAROLE_LDFLAGS = \
@@ -30,17 +23,10 @@
-export-symbols-regex "^[[^_]].*"
PAROLE_LIBS = \
- $(GTK_LIBS) \
- $(GLIB_LIBS) \
- $(GOBJECT_LIBS) \
$(GTHREAD_LIBS) \
$(GIO_LIBS) \
- $(DBUS_LIBS) \
$(DBUS_GLIB_LIBS) \
$(LIBXFCE4GUI_LIBS) \
- $(LIBXFCE4UTIL_LIBS) \
- $(GST_LIBS) \
- $(GST_BASE_LIBS) \
$(GST_VIDEO_LIBS) \
$(GST_INTERFACES_LIBS)
@@ -134,8 +120,7 @@
main.c
parole_media_player_LDADD = \
- libparole.la \
- $(PAROLE_LIBS)
+ libparole.la
parole_media_player_LDFLAGS = \
$(PAROLE_LDFLAGS)
@@ -167,9 +152,9 @@
--fprod "/* enumerations from \"@filename@\" */\n" \
--vhead "GType @enum_name at _get_type (void);\n#define ENUM_GTYPE_ at ENUMSHORT@ (@enum_name at _get_type())\n" \
--ftail "G_END_DECLS\n\n#endif /* __ENUM_GTYPES_H__ */" \
- $(parole_glib_enum_headers) ) > xgen-enum \
- && (cmp -s xgen-enum enum-gtypes.h || cp xgen-enum enum-gtypes.h) \
- && rm -f xgen-enum \
+ $(parole_glib_enum_headers) ) > xgen-enum.h \
+ && (cmp -s xgen-enum.h enum-gtypes.h || cp xgen-enum.h enum-gtypes.h) \
+ && rm -f xgen-enum.h \
&& echo timestamp > $(@F)
enum-gtypes.c: $(parole_glib_enum_headers) Makefile
@@ -184,9 +169,9 @@
--vhead "GType\n at enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G at Type@Value values[] = {" \
--vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
--vtail " { 0, NULL, NULL }\n };\n etype = g_ at type@_register_static (\"@EnumName@\", values);\n }\n return etype;\n}\n" \
- $(parole_glib_enum_headers) ) >> xgen-enum \
- && cp xgen-enum enum-gtypes.c \
- && rm -f xgen-enum
+ $(parole_glib_enum_headers) ) >> xgen-enum.c \
+ && cp xgen-enum.c enum-gtypes.c \
+ && rm -f xgen-enum.c
org.parole.media.list.h: $(srcdir)/org.parole.media.list.xml
dbus-binding-tool --mode=glib-server --prefix=parole_media_list $< >$@
Modified: parole/trunk/parole/main.c
===================================================================
--- parole/trunk/parole/main.c 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/main.c 2009-07-31 21:33:33 UTC (rev 7882)
@@ -59,6 +59,14 @@
}
static void
+parole_sig_handler (gint sig, gpointer data)
+{
+ ParolePlayer *player = (ParolePlayer *) data;
+
+ parole_player_terminate (player);
+}
+
+static void
parole_send_play_disc (DBusGProxy *proxy, const gchar *uri)
{
GError *error = NULL;
@@ -203,6 +211,27 @@
parole_media_list_add_files (list, filenames);
}
}
+
+ if ( xfce_posix_signal_handler_init (&error))
+ {
+ xfce_posix_signal_handler_set_handler(SIGHUP,
+ parole_sig_handler,
+ player, NULL);
+
+ xfce_posix_signal_handler_set_handler(SIGINT,
+ parole_sig_handler,
+ player, NULL);
+
+ xfce_posix_signal_handler_set_handler(SIGTERM,
+ parole_sig_handler,
+ player, NULL);
+ }
+ else
+ {
+ g_warning ("Unable to set up POSIX signal handlers: %s", error->message);
+ g_error_free (error);
+ }
+
plugins = parole_plugins_manager_new ();
parole_plugins_manager_load_plugins (plugins);
g_object_unref (builder);
Modified: parole/trunk/parole/parole-conf.c
===================================================================
--- parole/trunk/parole/parole-conf.c 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-conf.c 2009-07-31 21:33:33 UTC (rev 7882)
@@ -37,22 +37,7 @@
struct ParoleConfPrivate
{
- gchar *vis_sink;
- gboolean enable_vis;
- gboolean enable_subtitle;
- gchar *subtitle_font;
- gchar *subtitle_encoding;
-
- gboolean repeat;
- gboolean shuffle;
-
- gint brightness;
- gint contrast;
- gint hue;
- gint saturation;
- ParoleAspectRatio aspect_ratio;
- gint window_width;
- gint window_height;
+ GValue *values;
};
static gpointer parole_conf_object = NULL;
@@ -85,81 +70,43 @@
GParamSpec *pspec)
{
ParoleConf *conf;
+ GValue *dst;
+ GValue save_dst = { 0, };
+
conf = PAROLE_CONF (object);
+
+ dst = conf->priv->values + prop_id;
- switch (prop_id)
+ if ( !G_IS_VALUE (dst) )
{
- case PROP_VIS_ENABLED:
- conf->priv->enable_vis = g_value_get_boolean (value);
- g_object_notify (G_OBJECT (conf), pspec->name);
- parole_rc_write_entry_bool ("VIS_ENABLED", PAROLE_RC_GROUP_GENERAL, conf->priv->enable_vis);
- break;
- case PROP_SUBTITLE_ENCODING:
- if ( conf->priv->subtitle_encoding )
- g_free (conf->priv->subtitle_encoding);
- conf->priv->subtitle_encoding = g_value_dup_string (value);
- parole_rc_write_entry_string ("SUBTITLE_ENCODING", PAROLE_RC_GROUP_GENERAL, conf->priv->subtitle_encoding);
- break;
- case PROP_VIS_NAME:
- if ( conf->priv->vis_sink )
- g_free (conf->priv->vis_sink);
- conf->priv->vis_sink = g_value_dup_string (value);
- parole_rc_write_entry_string ("VIS_NAME", PAROLE_RC_GROUP_GENERAL, conf->priv->vis_sink);
- break;
- case PROP_SUBTITLE_ENABLED:
- conf->priv->enable_subtitle = g_value_get_boolean (value);
- parole_rc_write_entry_bool ("ENABLE_SUBTITLE", PAROLE_RC_GROUP_GENERAL, conf->priv->enable_subtitle);
- break;
- case PROP_SUBTITLE_FONT:
- if ( conf->priv->subtitle_font )
- g_free (conf->priv->subtitle_font);
- conf->priv->subtitle_font = g_value_dup_string (value);
- parole_rc_write_entry_string ("SUBTITLE_FONT", PAROLE_RC_GROUP_GENERAL, conf->priv->subtitle_font);
- break;
- case PROP_REPEAT:
- conf->priv->repeat = g_value_get_boolean (value);
- parole_rc_write_entry_bool ("REPEAT", PAROLE_RC_GROUP_GENERAL, conf->priv->repeat);
- break;
- case PROP_SHUFFLE:
- conf->priv->shuffle = g_value_get_boolean (value);
- parole_rc_write_entry_bool ("SHUFFLE", PAROLE_RC_GROUP_GENERAL, conf->priv->shuffle);
- break;
- case PROP_SATURATION:
- conf->priv->saturation = g_value_get_int (value);
- parole_rc_write_entry_int ("SATURATION", PAROLE_RC_GROUP_GENERAL, conf->priv->saturation);
- break;
- case PROP_HUE:
- conf->priv->hue = g_value_get_int (value);
- parole_rc_write_entry_int ("HUE", PAROLE_RC_GROUP_GENERAL, conf->priv->hue);
- break;
- case PROP_CONTRAST:
- conf->priv->contrast = g_value_get_int (value);
- parole_rc_write_entry_int ("CONTRAST", PAROLE_RC_GROUP_GENERAL, conf->priv->contrast);
- break;
- case PROP_BRIGHTNESS:
- conf->priv->brightness = g_value_get_int (value);
- parole_rc_write_entry_int ("BRIGHTNESS", PAROLE_RC_GROUP_GENERAL, conf->priv->brightness);
- break;
- case PROP_ASPECT_RATIO:
- conf->priv->aspect_ratio = g_value_get_enum (value);
- parole_rc_write_entry_int ("ASPECT_RATIO", PAROLE_RC_GROUP_GENERAL, conf->priv->aspect_ratio);
- break;
- case PROP_WINDOW_WIDTH:
- conf->priv->window_width = g_value_get_int (value);
- parole_rc_write_entry_int ("WINDOW_WIDTH", PAROLE_RC_GROUP_GENERAL, conf->priv->window_width);
- break;
- case PROP_WINDOW_HEIGHT:
- conf->priv->window_height = g_value_get_int (value);
- parole_rc_write_entry_int ("WINDOW_HEIGHT", PAROLE_RC_GROUP_GENERAL, conf->priv->window_height);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- goto out;
+ g_value_init (dst, pspec->value_type);
+ g_param_value_set_default (pspec, dst);
}
- g_object_notify (G_OBJECT (conf), pspec->name);
-
-out:
- ;
+
+ if ( g_param_values_cmp (pspec, value, dst) != 0 )
+ {
+ g_value_copy (value, dst);
+ g_object_notify (object, pspec->name);
+
+ if ( pspec->value_type != G_TYPE_STRING )
+ {
+ g_value_init (&save_dst, G_TYPE_STRING);
+
+ if ( G_LIKELY (g_value_transform (value, &save_dst)) )
+ {
+ g_object_set_property (G_OBJECT (conf), pspec->name, &save_dst);
+ parole_rc_write_entry_string (pspec->name, PAROLE_RC_GROUP_GENERAL, g_value_get_string (&save_dst));
+ }
+ else
+ g_warning ("Unable to save property : %s", pspec->name);
+
+ g_value_unset (&save_dst);
+ }
+ else
+ {
+ parole_rc_write_entry_string (pspec->name, PAROLE_RC_GROUP_GENERAL, g_value_get_string (value));
+ }
+ }
}
static void parole_conf_get_property (GObject *object,
@@ -168,73 +115,75 @@
GParamSpec *pspec)
{
ParoleConf *conf;
+ GValue *src;
+
conf = PAROLE_CONF (object);
-
- switch (prop_id)
+
+ src = conf->priv->values + prop_id;
+
+ if (G_VALUE_HOLDS (src, pspec->value_type))
{
- case PROP_SUBTITLE_ENCODING:
- g_value_set_string (value, conf->priv->subtitle_encoding);
- break;
- case PROP_VIS_ENABLED:
- g_value_set_boolean (value, conf->priv->enable_vis);
- break;
- case PROP_VIS_NAME:
- g_value_set_string (value, conf->priv->vis_sink);
- break;
- case PROP_SUBTITLE_ENABLED:
- g_value_set_boolean (value, conf->priv->enable_subtitle);
- break;
- case PROP_SUBTITLE_FONT:
- g_value_set_string (value, conf->priv->subtitle_font);
- break;
- case PROP_REPEAT:
- g_value_set_boolean (value, conf->priv->repeat);
- break;
- case PROP_SHUFFLE:
- g_value_set_boolean (value, conf->priv->shuffle);
- break;
- case PROP_SATURATION:
- g_value_set_int (value, conf->priv->saturation);
- break;
- case PROP_HUE:
- g_value_set_int (value, conf->priv->hue);
- break;
- case PROP_CONTRAST:
- g_value_set_int (value, conf->priv->contrast);
- break;
- case PROP_BRIGHTNESS:
- g_value_set_int (value, conf->priv->brightness);
- break;
- case PROP_ASPECT_RATIO:
- g_value_set_enum (value, conf->priv->aspect_ratio);
- break;
- case PROP_WINDOW_WIDTH:
- g_value_set_int (value, conf->priv->window_width);
- break;
- case PROP_WINDOW_HEIGHT:
- g_value_set_int (value, conf->priv->window_height);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
+ if (G_LIKELY (pspec->value_type == G_TYPE_STRING))
+ g_value_set_static_string (value, g_value_get_string (src));
+ else
+ g_value_copy (src, value);
}
+ else
+ {
+ g_param_value_set_default (pspec, value);
+ }
}
static void
parole_conf_finalize (GObject *object)
{
ParoleConf *conf;
+ guint i;
conf = PAROLE_CONF (object);
- g_free (conf->priv->vis_sink);
- g_free (conf->priv->subtitle_font);
- g_free (conf->priv->subtitle_encoding);
+ for ( i = 0; i < N_PROP; i++)
+ {
+ if ( G_IS_VALUE (conf->priv->values + i) )
+ g_value_unset (conf->priv->values + i);
+ }
+
+ g_free (conf->priv->values);
G_OBJECT_CLASS (parole_conf_parent_class)->finalize (object);
+
}
static void
+transform_string_to_boolean (const GValue *src,
+ GValue *dst)
+{
+ g_value_set_boolean (dst, !g_strcmp0 (g_value_get_string (src), "TRUE"));
+}
+
+static void
+transform_string_to_int (const GValue *src,
+ GValue *dst)
+{
+ g_value_set_int (dst, strtol (g_value_get_string (src), NULL, 10));
+}
+
+static void
+transform_string_to_enum (const GValue *src,
+ GValue *dst)
+{
+ GEnumClass *genum_class;
+ GEnumValue *genum_value;
+
+ genum_class = g_type_class_peek (G_VALUE_TYPE (dst));
+ genum_value = g_enum_get_value_by_name (genum_class, g_value_get_string (src));
+
+ if (G_UNLIKELY (genum_value == NULL))
+ genum_value = genum_class->values;
+ g_value_set_enum (dst, genum_value->value);
+}
+
+static void
parole_conf_class_init (ParoleConfClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -244,6 +193,15 @@
object_class->get_property = parole_conf_get_property;
object_class->set_property = parole_conf_set_property;
+ if (!g_value_type_transformable (G_TYPE_STRING, G_TYPE_INT))
+ g_value_register_transform_func (G_TYPE_STRING, G_TYPE_INT, transform_string_to_int);
+
+ if (!g_value_type_transformable (G_TYPE_STRING, G_TYPE_BOOLEAN))
+ g_value_register_transform_func (G_TYPE_STRING, G_TYPE_BOOLEAN, transform_string_to_boolean);
+
+ if (!g_value_type_transformable (G_TYPE_STRING, ENUM_GTYPE_ASPECT_RATIO))
+ g_value_register_transform_func (G_TYPE_STRING, ENUM_GTYPE_ASPECT_RATIO, transform_string_to_enum);
+
g_object_class_install_property (object_class,
PROP_VIS_ENABLED,
g_param_spec_boolean ("vis-enabled",
@@ -255,28 +213,28 @@
PROP_VIS_NAME,
g_param_spec_string ("vis-name",
NULL, NULL,
- NULL,
+ "none",
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_SUBTITLE_ENCODING,
g_param_spec_string ("subtitle-encoding",
NULL, NULL,
- NULL,
+ "UTF-8",
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_SUBTITLE_ENABLED,
g_param_spec_boolean ("enable-subtitle",
NULL, NULL,
- FALSE,
+ TRUE,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_SUBTITLE_FONT,
g_param_spec_string ("subtitle-font",
NULL, NULL,
- NULL,
+ "Sans 12",
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
@@ -358,24 +316,77 @@
}
static void
+parole_conf_load (ParoleConf *conf)
+{
+ XfceRc *rc;
+ const gchar *name;
+ const gchar *str;
+ GParamSpec **pspecs, *pspec;
+ guint nspecs, i;
+ GValue src = { 0, }, dst = { 0, };
+
+ rc = parole_get_resource_file (PAROLE_RC_GROUP_GENERAL, TRUE);
+
+ if ( G_UNLIKELY (rc == NULL ) )
+ {
+ g_warning ("Unable to lookup rc file in : %s\n", PAROLE_RESOURCE_FILE);
+ return;
+ }
+
+ g_object_freeze_notify (G_OBJECT (conf));
+
+ pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (conf), &nspecs);
+
+ g_value_init (&src, G_TYPE_STRING);
+
+ for ( i = 0; i < nspecs; i++)
+ {
+ pspec = pspecs[i];
+ name = g_param_spec_get_name (pspec);
+
+ str = xfce_rc_read_entry (rc, pspec->name, NULL);
+
+ if ( str )
+ {
+ g_value_set_static_string (&src, str);
+
+ if ( pspec->value_type == G_TYPE_STRING )
+ {
+ g_object_set_property (G_OBJECT (conf), name, &src);
+ }
+ else
+ {
+ g_value_init (&dst, G_PARAM_SPEC_VALUE_TYPE (pspec));
+
+ if ( G_LIKELY (g_value_transform (&src, &dst)))
+ {
+ g_object_set_property (G_OBJECT (conf), name, &dst);
+ }
+ else
+ {
+ g_warning ("Unable to load property %s", name);
+ }
+
+ g_value_unset (&dst);
+ }
+ }
+ }
+
+ xfce_rc_close (rc);
+ g_value_unset (&src);
+ g_object_thaw_notify (G_OBJECT (conf));
+ g_free (pspecs);
+}
+
+static void
parole_conf_init (ParoleConf *conf)
{
conf->priv = PAROLE_CONF_GET_PRIVATE (conf);
- conf->priv->enable_vis = parole_rc_read_entry_bool ("VIS_ENABLED", PAROLE_RC_GROUP_GENERAL, FALSE);
- conf->priv->vis_sink = g_strdup (parole_rc_read_entry_string ("VIS_NAME", PAROLE_RC_GROUP_GENERAL, "none"));
- conf->priv->enable_subtitle = parole_rc_read_entry_bool ("ENABLE_SUBTITLE", PAROLE_RC_GROUP_GENERAL, TRUE);
- conf->priv->subtitle_font = g_strdup (parole_rc_read_entry_string ("SUBTITLE_FONT", PAROLE_RC_GROUP_GENERAL, "Sans 12"));
- conf->priv->subtitle_encoding = g_strdup (parole_rc_read_entry_string ("SUBTITLE_ENCODING", PAROLE_RC_GROUP_GENERAL, "UTF8"));
- conf->priv->repeat = parole_rc_read_entry_bool ("REPEAT", PAROLE_RC_GROUP_GENERAL, FALSE);
- conf->priv->shuffle = parole_rc_read_entry_bool ("SHUFFLE", PAROLE_RC_GROUP_GENERAL, FALSE);
- conf->priv->saturation = parole_rc_read_entry_int ("SATURATION", PAROLE_RC_GROUP_GENERAL, 0);
- conf->priv->hue = parole_rc_read_entry_int ("HUE", PAROLE_RC_GROUP_GENERAL, 0);
- conf->priv->contrast = parole_rc_read_entry_int ("CONTRAST", PAROLE_RC_GROUP_GENERAL, 0);
- conf->priv->brightness = parole_rc_read_entry_int ("BRIGHTNESS", PAROLE_RC_GROUP_GENERAL, 0);
- conf->priv->aspect_ratio = parole_rc_read_entry_int ("ASPECT_RATIO", PAROLE_RC_GROUP_GENERAL, PAROLE_ASPECT_RATIO_NONE);
- conf->priv->window_width = parole_rc_read_entry_int ("WINDOW_WIDTH", PAROLE_RC_GROUP_GENERAL, 780);
- conf->priv->window_height = parole_rc_read_entry_int ("WINDOW_HEIGHT", PAROLE_RC_GROUP_GENERAL, 480);
+ conf->priv->values = g_new0 (GValue, N_PROP);
+
+ parole_conf_load (conf);
+
}
ParoleConf *
Modified: parole/trunk/parole/parole-disc-menu.c
===================================================================
--- parole/trunk/parole/parole-disc-menu.c 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-disc-menu.c 2009-07-31 21:33:33 UTC (rev 7882)
@@ -26,6 +26,8 @@
#include <stdlib.h>
#include <string.h>
+#include <libxfce4util/libxfce4util.h>
+
#include "parole-disc-menu.h"
#include "parole-builder.h"
#include "parole-statusbar.h"
@@ -39,11 +41,13 @@
struct ParoleDiscMenuPrivate
{
ParoleGst *gst;
-
+ ParoleMediaType current_media_type;
GtkWidget *next_chapter;
GtkWidget *prev_chapter;
GtkWidget *dvd_menu;
GtkWidget *chapter_menu;
+ GtkWidget *info;
+ GtkWidget *eventboxinfo;
};
G_DEFINE_TYPE (ParoleDiscMenu, parole_disc_menu, G_TYPE_OBJECT)
@@ -53,15 +57,23 @@
{
gtk_widget_hide (menu->priv->next_chapter);
gtk_widget_hide (menu->priv->prev_chapter);
+ gtk_widget_hide (menu->priv->info);
+ gtk_widget_hide (menu->priv->eventboxinfo);
//gtk_widget_hide (menu->priv->dvd_menu);
//gtk_widget_hide (menu->priv->chapter_menu);
}
static void
-parole_disc_menu_show (ParoleDiscMenu *menu)
+parole_disc_menu_show (ParoleDiscMenu *menu, gboolean show_label)
{
gtk_widget_show (menu->priv->next_chapter);
gtk_widget_show (menu->priv->prev_chapter);
+
+ if ( show_label )
+ {
+ gtk_widget_show (menu->priv->eventboxinfo);
+ gtk_widget_show (menu->priv->info);
+ }
//gtk_widget_show (menu->priv->dvd_menu);
//gtk_widget_show (menu->priv->chapter_menu);
@@ -75,40 +87,71 @@
if ( state < PAROLE_MEDIA_STATE_PAUSED )
{
+ gtk_label_set_markup (GTK_LABEL (menu->priv->info), NULL);
parole_disc_menu_hide (menu);
}
- else
+ else if ( state == PAROLE_MEDIA_STATE_PLAYING )
{
g_object_get (G_OBJECT (stream),
"media-type", &media_type,
NULL);
+
if ( media_type == PAROLE_MEDIA_TYPE_DVD )
{
- parole_disc_menu_show (menu);
+ gtk_button_set_label (GTK_BUTTON (menu->priv->next_chapter), _("Next Chapter"));
+ gtk_button_set_label (GTK_BUTTON (menu->priv->prev_chapter), _("Previous Chapter"));
+ parole_disc_menu_show (menu, FALSE);
}
+ else if ( media_type == PAROLE_MEDIA_TYPE_CDDA )
+ {
+ guint num_tracks;
+ guint current;
+ gchar *text;
+ gtk_button_set_label (GTK_BUTTON (menu->priv->next_chapter), _("Next Track"));
+ gtk_button_set_label (GTK_BUTTON (menu->priv->prev_chapter), _("Previous Track"));
+
+ g_object_get (G_OBJECT (stream),
+ "num-tracks", &num_tracks,
+ "track", ¤t,
+ NULL);
+
+ text = g_strdup_printf ("<span font_desc='sans 8' font_size='xx-large' color='#510DEC'>%s %i/%i</span>", _("Playing Track"), current, num_tracks);
+
+ gtk_label_set_markup (GTK_LABEL (menu->priv->info), text);
+
+ g_free (text);
+ parole_disc_menu_show (menu, TRUE);
+ }
+ menu->priv->current_media_type = media_type;
}
}
static void
-parole_disc_next_chapter_cb (ParoleDiscMenu *menu)
+parole_disc_menu_next_chapter_cb (ParoleDiscMenu *menu)
{
- parole_gst_next_dvd_chapter (menu->priv->gst);
+ if ( menu->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
+ parole_gst_next_dvd_chapter (menu->priv->gst);
+ else if ( menu->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA)
+ parole_gst_next_cdda_track (menu->priv->gst);
}
static void
-parole_disc_prev_chapter_cb (ParoleDiscMenu *menu)
+parole_disc_menu_prev_chapter_cb (ParoleDiscMenu *menu)
{
- parole_gst_prev_dvd_chapter (menu->priv->gst);
+ if ( menu->priv->current_media_type == PAROLE_MEDIA_TYPE_DVD )
+ parole_gst_prev_dvd_chapter (menu->priv->gst);
+ else if ( menu->priv->current_media_type == PAROLE_MEDIA_TYPE_CDDA)
+ parole_gst_prev_cdda_track (menu->priv->gst);
}
static void
-parole_disc_dvd_menu_cb (ParoleDiscMenu *menu)
+parole_disc_menu_dvd_menu_cb (ParoleDiscMenu *menu)
{
}
static void
-parole_disc_chapter_menu_cb (ParoleDiscMenu *menu)
+parole_disc_menu_chapter_menu_cb (ParoleDiscMenu *menu)
{
}
@@ -127,6 +170,8 @@
parole_disc_menu_init (ParoleDiscMenu *menu)
{
GtkBuilder *builder;
+ GdkColor color;
+
menu->priv = PAROLE_DISC_MENU_GET_PRIVATE (menu);
builder = parole_builder_get_main_interface ();
@@ -135,19 +180,25 @@
menu->priv->prev_chapter = GTK_WIDGET (gtk_builder_get_object (builder, "prev-chapter"));
menu->priv->chapter_menu = GTK_WIDGET (gtk_builder_get_object (builder, "chapter-menu"));
menu->priv->dvd_menu = GTK_WIDGET (gtk_builder_get_object (builder, "dvd-menu"));
+ menu->priv->info = GTK_WIDGET (gtk_builder_get_object (builder, "info"));
+ menu->priv->eventboxinfo = GTK_WIDGET (gtk_builder_get_object (builder, "eventboxinfo"));
+ gdk_color_parse ("black", &color);
+ gtk_widget_modify_bg (menu->priv->eventboxinfo, GTK_STATE_NORMAL, &color);
+
+ menu->priv->current_media_type = PAROLE_MEDIA_TYPE_UNKNOWN;
g_signal_connect_swapped (menu->priv->next_chapter, "clicked",
- G_CALLBACK (parole_disc_next_chapter_cb), menu);
+ G_CALLBACK (parole_disc_menu_next_chapter_cb), menu);
g_signal_connect_swapped (menu->priv->prev_chapter, "clicked",
- G_CALLBACK (parole_disc_prev_chapter_cb), menu);
+ G_CALLBACK (parole_disc_menu_prev_chapter_cb), menu);
g_signal_connect_swapped (menu->priv->dvd_menu, "clicked",
- G_CALLBACK (parole_disc_dvd_menu_cb), menu);
+ G_CALLBACK (parole_disc_menu_dvd_menu_cb), menu);
g_signal_connect_swapped (menu->priv->chapter_menu, "clicked",
- G_CALLBACK (parole_disc_chapter_menu_cb), menu);
+ G_CALLBACK (parole_disc_menu_chapter_menu_cb), menu);
menu->priv->gst = PAROLE_GST (parole_gst_new ());
@@ -179,3 +230,13 @@
{
return (GTK_WIDGET_VISIBLE (menu->priv->next_chapter));
}
+
+void parole_disc_menu_seek_next (ParoleDiscMenu *menu)
+{
+ parole_disc_menu_next_chapter_cb (menu);
+}
+
+void parole_disc_menu_seek_prev (ParoleDiscMenu *menu)
+{
+ parole_disc_menu_prev_chapter_cb (menu);
+}
Modified: parole/trunk/parole/parole-disc-menu.h
===================================================================
--- parole/trunk/parole/parole-disc-menu.h 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-disc-menu.h 2009-07-31 21:33:33 UTC (rev 7882)
@@ -48,6 +48,10 @@
gboolean parole_disc_menu_visible (ParoleDiscMenu *menu);
+void parole_disc_menu_seek_next (ParoleDiscMenu *menu);
+
+void parole_disc_menu_seek_prev (ParoleDiscMenu *menu);
+
G_END_DECLS
#endif /* __PAROLE_DISC_MENU_H */
Modified: parole/trunk/parole/parole-disc.c
===================================================================
--- parole/trunk/parole/parole-disc.c 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-disc.c 2009-07-31 21:33:33 UTC (rev 7882)
@@ -76,81 +76,106 @@
g_signal_emit (G_OBJECT (disc), signals [DISC_SELECTED], 0, uri);
}
+static MountData *
+parole_disc_get_mount_data (ParoleDisc *disc, const gchar *label, const gchar *uri, ParoleDiscKind kind)
+{
+ MountData *data;
+ GtkWidget *img;
+
+ data = g_new0 (MountData, 1);
+ data->kind = kind;
+ data->uri = g_strdup (uri);
+
+ data->mi = gtk_image_menu_item_new_with_label (label);
+
+ img = gtk_image_new_from_stock (GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (data->mi),
+ img);
+ gtk_widget_show (data->mi);
+ gtk_widget_show (img);
+
+ g_object_set_data_full (G_OBJECT (data->mi),
+ "uri", data->uri,
+ (GDestroyNotify) g_free);
+
+ gtk_menu_shell_insert (GTK_MENU_SHELL (disc->priv->media_menu), data->mi, 2);
+ g_signal_connect (data->mi, "activate",
+ G_CALLBACK (parole_disc_media_activate_cb), disc);
+ return data;
+}
+
static void
parole_disc_add_mount_to_menu (ParoleDisc *disc, GMount *mount)
{
- MountData *data;
GFile *file;
gchar **content_type;
guint i;
+ ParoleDiscKind kind;
+ gchar *uri;
file = g_mount_get_root (mount);
- data = g_new0 (MountData, 1);
- data->kind = PAROLE_DISC_UNKNOWN;
-
+ if ( g_file_has_uri_scheme (file, "cdda") )
+ {
+ kind = PAROLE_DISC_CDDA;
+ uri = g_strdup ("cdda:/");
+ goto got_cdda;
+ }
+
content_type = g_content_type_guess_for_tree (file);
-
+
for ( i = 0; content_type && content_type[i]; i++)
{
+ TRACE ("Checking disc content type : %s", content_type[i]);
+
if ( !g_strcmp0 (content_type[i], "x-content/video-dvd") )
{
- data->kind = PAROLE_DISC_DVD;
- data->uri = g_strdup ("dvd:/");
+ kind = PAROLE_DISC_DVD;
+ uri = g_strdup ("dvd:/");
break;
}
else if ( !g_strcmp0 (content_type[i], "x-content/video-vcd") )
{
- data->kind = PAROLE_DISC_VCD;
- data->uri = g_strdup ("vcd:/");
+ kind = PAROLE_DISC_VCD;
+ uri = g_strdup ("vcd:/");
break;
}
else if ( !g_strcmp0 (content_type[i], "x-content/video-svcd") )
{
- data->kind = PAROLE_DISC_SVCD;
- data->uri = g_strdup ("svcd:/");
+ kind = PAROLE_DISC_SVCD;
+ uri = g_strdup ("svcd:/");
break;
}
else if ( !g_strcmp0 (content_type[i], "x-content/audio-cdda") )
{
- data->kind = PAROLE_DISC_CDDA;
- data->uri = g_strdup ("cdda:/");
+ kind = PAROLE_DISC_CDDA;
+ uri = g_strdup ("cdda:/");
break;
}
}
if ( content_type )
g_strfreev (content_type);
-
- if ( data->kind != PAROLE_DISC_UNKNOWN )
+
+got_cdda:
+ if ( kind != PAROLE_DISC_UNKNOWN )
{
- GtkWidget *img;
+ MountData *data;
gchar *name;
gchar *label;
+
name = g_mount_get_name (mount);
label = g_strdup_printf ("%s %s", _("Play Disc"), name);
- data->mi = gtk_image_menu_item_new_with_label (label);
+ data = parole_disc_get_mount_data (disc, label, uri, kind);
+ g_free (uri);
- img = gtk_image_new_from_stock (GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (data->mi),
- img);
- gtk_widget_show (data->mi);
- gtk_widget_show (img);
-
- g_object_set_data_full (G_OBJECT (data->mi),
- "uri", data->uri,
- (GDestroyNotify) g_free);
-
- gtk_menu_shell_insert (GTK_MENU_SHELL (disc->priv->media_menu), data->mi, 2);
- g_signal_connect (data->mi, "activate",
- G_CALLBACK (parole_disc_media_activate_cb), disc);
+ g_ptr_array_add (disc->priv->array, data);
g_free (label);
g_free (name);
- g_ptr_array_add (disc->priv->array, data);
}
- else
- g_free (data);
+
+ g_object_unref (file);
}
static void
@@ -169,10 +194,14 @@
GMount *mount;
volume = g_list_nth_data (list, i);
+ TRACE ("Volume name %s", g_volume_get_name (volume));
+
mount = g_volume_get_mount (volume);
if ( mount )
{
+ TRACE ("Mount name : %s", g_mount_get_name (mount));
parole_disc_add_mount_to_menu (disc, mount);
+ g_object_unref (mount);
}
}
@@ -195,7 +224,8 @@
{
GDrive *drive;
drive = g_list_nth_data (list, i);
- if ( g_drive_can_eject (drive) )
+
+ if ( g_drive_can_eject (drive) && g_drive_has_media (drive) )
parole_disc_add_drive (disc, drive);
}
Modified: parole/trunk/parole/parole-gst.c
===================================================================
--- parole/trunk/parole/parole-gst.c 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-gst.c 2009-07-31 21:33:33 UTC (rev 7882)
@@ -52,8 +52,13 @@
(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_GST, ParoleGstPrivate))
static void parole_gst_play_file_internal (ParoleGst *gst);
+
static void parole_gst_change_state (ParoleGst *gst,
GstState new);
+
+static void parole_gst_seek_cdda_track (ParoleGst *gst,
+ gint track) G_GNUC_UNUSED;
+
struct ParoleGstPrivate
{
GstElement *playbin;
@@ -116,12 +121,11 @@
g_object_unref (gst->priv->stream);
g_object_unref (gst->priv->playbin);
g_object_unref (gst->priv->bus);
-
+ g_object_unref (gst->priv->conf);
g_object_unref (gst->priv->logo);
+
g_mutex_free (gst->priv->lock);
- g_object_unref (gst->priv->conf);
-
G_OBJECT_CLASS (parole_gst_parent_class)->finalize (object);
}
@@ -561,14 +565,47 @@
}
static void
+parole_gst_query_cdda_tracks (ParoleGst *gst)
+{
+ GstFormat format;
+ gint64 duration;
+ gint tracks;
+
+ format = gst_format_get_by_nick ("track");
+
+ if ( format != GST_FORMAT_UNDEFINED )
+ {
+ gst_element_query_duration (gst->priv->playbin, &format, &duration);
+
+ tracks = (gint) duration;
+
+ TRACE ("CDDA source has %d tacks", tracks);
+
+ g_object_set (G_OBJECT (gst->priv->stream),
+ "num-tracks", tracks,
+ NULL);
+ }
+}
+
+static void
parole_gst_query_duration (ParoleGst *gst)
{
+ ParoleMediaType media_type;
gint64 absolute_duration = 0;
gdouble duration = 0;
gboolean live;
- GstFormat gst_time = GST_FORMAT_TIME;
+ GstFormat gst_time;
+ g_object_get (G_OBJECT (gst->priv->stream),
+ "media-type", &media_type,
+ NULL);
+
+ if ( media_type == PAROLE_MEDIA_TYPE_CDDA )
+ parole_gst_query_cdda_tracks (gst);
+
+ gst_time = GST_FORMAT_TIME;
+
gst_element_query_duration (gst->priv->playbin,
&gst_time,
&absolute_duration);
@@ -577,7 +614,9 @@
{
duration = absolute_duration / ((gdouble) 60 * 1000 * 1000 * 1000);
live = ( absolute_duration == 0 );
+
TRACE ("Duration %e is_live=%d", duration, live);
+
g_object_set (G_OBJECT (gst->priv->stream),
"absolute-duration", absolute_duration,
"duration", duration,
@@ -817,7 +856,7 @@
parole_gst_evaluate_state (ParoleGst *gst, GstState old, GstState new, GstState pending)
{
TRACE ("State change new %i old %i pending %i", new, old, pending);
-
+
gst->priv->state = new;
parole_gst_tick (gst);
@@ -828,10 +867,12 @@
switch (gst->priv->state)
{
case GST_STATE_PLAYING:
+ {
gst->priv->media_state = PAROLE_MEDIA_STATE_PLAYING;
g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0,
gst->priv->stream, PAROLE_MEDIA_STATE_PLAYING);
break;
+ }
case GST_STATE_PAUSED:
if ( old == GST_STATE_READY )
{
@@ -839,8 +880,11 @@
parole_gst_query_capabilities (gst);
parole_gst_query_info (gst);
}
- if ( gst->priv->update_color_balance && gst->priv->target == GST_STATE_PLAYING )
- parole_gst_set_video_color_balance (gst);
+ if ( gst->priv->target == GST_STATE_PLAYING )
+ {
+ if ( gst->priv->update_color_balance )
+ parole_gst_set_video_color_balance (gst);
+ }
gst->priv->media_state = PAROLE_MEDIA_STATE_PAUSED;
g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0,
@@ -891,8 +935,26 @@
}
static void
-parole_gst_get_meta_data (ParoleGst *gst, GstTagList *tag)
+parole_gst_get_meta_data_cdda (ParoleGst *gst, GstTagList *tag)
{
+ guint num_tracks;
+ guint track;
+
+ if (gst_tag_list_get_uint (tag, GST_TAG_TRACK_NUMBER, &track) &&
+ gst_tag_list_get_uint (tag, GST_TAG_TRACK_COUNT, &num_tracks))
+ {
+ g_object_set (G_OBJECT (gst->priv->stream),
+ "num-tracks", num_tracks,
+ "track", track,
+ NULL);
+ TRACE ("num_tracks=%i track=%i", num_tracks, track);
+ g_signal_emit (G_OBJECT (gst), signals [MEDIA_TAG], 0, gst->priv->stream);
+ }
+}
+
+static void
+parole_gst_get_meta_data_local_file (ParoleGst *gst, GstTagList *tag)
+{
gchar *str;
GDate *date;
@@ -950,9 +1012,32 @@
NULL);
g_signal_emit (G_OBJECT (gst), signals [MEDIA_TAG], 0, gst->priv->stream);
+
}
static void
+parole_gst_get_meta_data (ParoleGst *gst, GstTagList *tag)
+{
+ ParoleMediaType media_type;
+
+ g_object_get (G_OBJECT (gst->priv->stream),
+ "media-type", &media_type,
+ NULL);
+
+ switch ( media_type )
+ {
+ case PAROLE_MEDIA_TYPE_LOCAL_FILE:
+ parole_gst_get_meta_data_local_file (gst, tag);
+ break;
+ case PAROLE_MEDIA_TYPE_CDDA:
+ parole_gst_get_meta_data_cdda (gst, tag);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
parole_gst_application_message (ParoleGst *gst, GstMessage *msg)
{
const gchar *name;
@@ -984,11 +1069,36 @@
switch (GST_MESSAGE_TYPE (msg))
{
case GST_MESSAGE_EOS:
+ {
+ ParoleMediaType media_type;
+ gint current_track;
+
TRACE ("End of stream");
+
+ g_object_get (G_OBJECT (gst->priv->stream),
+ "media-type", &media_type,
+ NULL);
+ if ( media_type == PAROLE_MEDIA_TYPE_CDDA )
+ {
+ gint num_tracks;
+ g_object_get (G_OBJECT (gst->priv->stream),
+ "num-tracks", &num_tracks,
+ "track", ¤t_track,
+ NULL);
+
+ TRACE ("------------------Current track %d Number of tracks %d", current_track, num_tracks);
+ if ( num_tracks != current_track )
+ {
+ parole_gst_seek_cdda_track (gst, current_track);
+ break;
+ }
+ }
+
gst->priv->media_state = PAROLE_MEDIA_STATE_FINISHED;
g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0,
gst->priv->stream, PAROLE_MEDIA_STATE_FINISHED);
break;
+ }
case GST_MESSAGE_ERROR:
{
GError *error = NULL;
@@ -1286,30 +1396,73 @@
return ret;
}
+static void parole_gst_seek_cdda_track (ParoleGst *gst,
+ gint track)
+{
+ TRACE ("Track %d", track);
+
+ if ( !gst_element_seek (gst->priv->playbin, 1.0, gst_format_get_by_nick ("track"),
+ GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET,
+ track,
+ GST_SEEK_TYPE_NONE,
+ 0) )
+ g_warning ("Seek to track %d failed ", track);
+}
+
static void
-parole_gst_change_dvd_chapter (ParoleGst *gst, gint level)
+parole_gst_seek_by_format (ParoleGst *gst, GstFormat format, gint step)
{
- GstFormat format;
- gint64 val;
+ gint64 val = 1;
- format = gst_format_get_by_nick ("chapter");
-
- if ( format != GST_FORMAT_UNDEFINED )
+ if ( gst_element_query_position (gst->priv->playbin, &format, &val) )
{
- if ( gst_element_query_position (gst->priv->playbin, &format, &val) )
+ val += step;
+ if ( !gst_element_seek (gst->priv->playbin, 1.0, format,
+ GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET,
+ val,
+ GST_SEEK_TYPE_NONE,
+ 0) )
{
- val += level;
- gst_element_seek (gst->priv->playbin, 1.0, format,
- GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET,
- val,
- GST_SEEK_TYPE_NONE,
- 0);
+ g_warning ("Seek failed : %s", gst_format_get_name (format));
}
}
+ else
+ {
+ g_warning ("Failed to query element position: %s", gst_format_get_name (format));
+ }
+}
+
+static void
+parole_gst_change_dvd_chapter (ParoleGst *gst, gint level)
+{
+ GstFormat format;
+
+ // FIXME: Do we really need to get the nich each time?
+ format = gst_format_get_by_nick ("chapter");
+ parole_gst_seek_by_format (gst, format, level);
}
static void
+parole_gst_change_cdda_track (ParoleGst *gst, gint level)
+{
+ GstFormat format;
+
+ format = gst_format_get_by_nick ("track");
+
+ parole_gst_seek_by_format (gst, format, level);
+}
+
+ParoleMediaType parole_gst_get_current_stream_type (ParoleGst *gst)
+{
+ ParoleMediaType type;
+ g_object_get (G_OBJECT (gst->priv->stream),
+ "media-type", &type,
+ NULL);
+ return type;
+}
+
+static void
parole_gst_conf_notify_cb (GObject *object, GParamSpec *spec, ParoleGst *gst)
{
if ( !g_strcmp0 ("vis-enabled", spec->name) || !g_strcmp0 ("vis-name", spec->name) )
@@ -1560,7 +1713,6 @@
}
}
}
-
parole_gst_change_state (gst, GST_STATE_NULL);
}
@@ -1643,6 +1795,33 @@
parole_gst_change_dvd_chapter (gst, -1);
}
+void parole_gst_next_cdda_track (ParoleGst *gst)
+{
+ parole_gst_change_cdda_track (gst, 1);
+}
+
+void parole_gst_prev_cdda_track (ParoleGst *gst)
+{
+ parole_gst_change_cdda_track (gst, -1);
+}
+
+gint parole_gst_get_current_cdda_track (ParoleGst *gst)
+{
+ GstFormat format;
+ gint64 pos;
+ gint ret_val = 1;
+
+ format = gst_format_get_by_nick ("track");
+
+ if ( gst_element_query_position (gst->priv->playbin, &format, &pos) )
+ {
+ TRACE ("Pos %lld", pos);
+ ret_val = (gint) pos;
+ }
+
+ return ret_val;
+}
+
gdouble parole_gst_get_stream_duration (ParoleGst *gst)
{
gdouble dur;
Modified: parole/trunk/parole/parole-gst.h
===================================================================
--- parole/trunk/parole/parole-gst.h 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-gst.h 2009-07-31 21:33:33 UTC (rev 7882)
@@ -112,6 +112,14 @@
void parole_gst_prev_dvd_chapter (ParoleGst *gst);
+void parole_gst_next_cdda_track (ParoleGst *gst);
+
+void parole_gst_prev_cdda_track (ParoleGst *gst);
+
+gint parole_gst_get_current_cdda_track (ParoleGst *gst);
+
+ParoleMediaType parole_gst_get_current_stream_type (ParoleGst *gst);
+
gdouble parole_gst_get_stream_duration (ParoleGst *gst);
gdouble parole_gst_get_stream_position (ParoleGst *gst);
Modified: parole/trunk/parole/parole-mediachooser.c
===================================================================
--- parole/trunk/parole/parole-mediachooser.c 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-mediachooser.c 2009-07-31 21:33:33 UTC (rev 7882)
@@ -53,6 +53,9 @@
void media_chooser_folder_changed_cb (GtkWidget *widget,
gpointer data);
+void media_chooser_file_activate_cb (GtkFileChooser *filechooser,
+ ParoleMediaChooser *chooser);
+
enum
{
MEDIA_FILES_OPENED,
@@ -123,6 +126,11 @@
gtk_widget_destroy (GTK_WIDGET (chooser));
}
+void media_chooser_file_activate_cb (GtkFileChooser *filechooser, ParoleMediaChooser *chooser)
+{
+ parole_media_chooser_open (NULL, chooser);
+}
+
static void
parole_media_chooser_open_internal (GtkWidget *chooser)
{
Modified: parole/trunk/parole/parole-player.c
===================================================================
--- parole/trunk/parole/parole-player.c 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-player.c 2009-07-31 21:33:33 UTC (rev 7882)
@@ -173,6 +173,8 @@
ParoleConf *conf;
ParoleDiscMenu *disc_menu;
ParoleSession *session;
+
+ GtkRecentManager *recent;
GtkWidget *gst;
@@ -295,11 +297,14 @@
static void
parole_player_change_range_value (ParolePlayer *player, gdouble value)
{
- player->priv->internal_range_change = TRUE;
+ if ( !player->priv->user_seeking )
+ {
+ player->priv->internal_range_change = TRUE;
- gtk_range_set_value (GTK_RANGE (player->priv->range), value);
+ gtk_range_set_value (GTK_RANGE (player->priv->range), value);
- player->priv->internal_range_change = FALSE;
+ player->priv->internal_range_change = FALSE;
+ }
}
static void
@@ -417,19 +422,23 @@
gboolean save = TRUE;
gchar **lines = NULL;
guint i;
+
+ g_object_get (G_OBJECT (stream),
+ "uri", &uri,
+ NULL);
g_object_get (G_OBJECT (stream),
"media-type", &media_type,
NULL);
if ( media_type == PAROLE_MEDIA_TYPE_LOCAL_FILE )
- return;
+ {
+ gtk_recent_manager_add_item (player->priv->recent, uri);
+ goto out;
+ }
lines = parole_get_history ();
- g_object_get (G_OBJECT (stream),
- "uri", &uri,
- NULL);
if (lines )
{
for ( i = 0; lines[i]; i++)
@@ -448,6 +457,7 @@
}
g_strfreev (lines);
+out:
g_free (uri);
}
@@ -480,9 +490,11 @@
if ( seekable )
{
+ player->priv->internal_range_change = TRUE;
gtk_range_set_range (GTK_RANGE (player->priv->range), 0, duration);
gtk_widget_set_sensitive (player->priv->seekf, TRUE);
gtk_widget_set_sensitive (player->priv->seekb, TRUE);
+ player->priv->internal_range_change = FALSE;
}
else
{
@@ -747,6 +759,7 @@
{
value = gtk_range_get_value (GTK_RANGE (range));
player->priv->user_seeking = TRUE;
+ TRACE ("Sending a seek request with value :%e", value);
parole_gst_seek (PAROLE_GST (player->priv->gst), value);
player->priv->user_seeking = FALSE;
}
@@ -825,13 +838,13 @@
static void
parole_player_next_menu_item_activate (ParolePlayer *player)
{
- parole_gst_next_dvd_chapter (PAROLE_GST (player->priv->gst));
+ parole_disc_menu_seek_next (player->priv->disc_menu);
}
static void
parole_player_previous_menu_item_activate (ParolePlayer *player)
{
- parole_gst_prev_dvd_chapter (PAROLE_GST (player->priv->gst));
+ parole_disc_menu_seek_prev (player->priv->disc_menu);
}
static void
@@ -915,9 +928,12 @@
GtkWidget *menu, *mi, *img;
gboolean sensitive;
gboolean dvd_menu;
+ ParoleMediaType media_type;
dvd_menu = parole_disc_menu_visible (player->priv->disc_menu);
+ media_type = parole_gst_get_current_stream_type (PAROLE_GST (player->priv->gst));
+
menu = gtk_menu_new ();
/*Play menu item
@@ -936,7 +952,8 @@
G_CALLBACK (parole_player_play_menu_item_activate), player);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
- /*Seek Forward.
+ /*
+ * Seek Forward.
*/
mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_FORWARD, NULL);
@@ -946,7 +963,8 @@
G_CALLBACK (parole_player_seekf_cb), player);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
- /*Seek backward.
+ /*
+ * Seek backward.
*/
mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_REWIND, NULL);
@@ -956,7 +974,8 @@
G_CALLBACK (parole_player_seekb_cb), player);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
- /*Stop menu item
+ /*
+ * Stop menu item
*/
mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_STOP, NULL);
@@ -966,9 +985,10 @@
G_CALLBACK (parole_player_stop_menu_item_activate), player);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
- /*Next chapter menu item
+ /*
+ * Next chapter menu item
*/
- mi = gtk_image_menu_item_new_with_label (_("Next Chapter"));
+ mi = gtk_image_menu_item_new_with_label (media_type == PAROLE_MEDIA_TYPE_CDDA ? _("Next Track") : _("Next Chapter"));
img = gtk_image_new_from_stock (GTK_STOCK_MEDIA_NEXT, GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi),img);
gtk_widget_set_sensitive (mi, (player->priv->state == PAROLE_MEDIA_STATE_PLAYING) && dvd_menu);
@@ -977,9 +997,10 @@
G_CALLBACK (parole_player_next_menu_item_activate), player);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
- /*Previous chapter menu item
+ /*
+ * Previous chapter menu item
*/
- mi = gtk_image_menu_item_new_with_label (_("Previous Chapter"));
+ mi = gtk_image_menu_item_new_with_label (media_type == PAROLE_MEDIA_TYPE_CDDA ? _("Previous Track") : _("Previous Chapter"));
img = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PREVIOUS, GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), img);
@@ -1303,6 +1324,21 @@
TRUE);
}
+static void
+parole_player_set_sound_menu_items_image (GtkBuilder *builder)
+{
+ GtkWidget *img;
+
+ img = gtk_image_new_from_icon_name ("audio-volume-muted", GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (gtk_builder_get_object (builder, "volume-mute-menu")), img);
+
+ img = gtk_image_new_from_icon_name ("audio-volume-high", GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (gtk_builder_get_object (builder, "volume-up-menu")), img);
+
+ img = gtk_image_new_from_icon_name ("audio-volume-low", GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (gtk_builder_get_object (builder, "volume-down-menu")), img);
+}
+
gboolean
parole_player_configure_event_cb (GtkWidget *widget, GdkEventConfigure *ev, ParolePlayer *player)
{
@@ -1365,6 +1401,9 @@
player->priv->buffering = FALSE;
player->priv->row = NULL;
+ player->priv->recent = gtk_recent_manager_get_default ();
+
+ parole_player_set_sound_menu_items_image (builder);
/*
* Gst signals
*/
@@ -1492,3 +1531,8 @@
{
parole_player_disc_selected_cb (NULL, uri, player);
}
+
+void parole_player_terminate (ParolePlayer *player)
+{
+ parole_player_delete_event_cb (NULL, NULL, player);
+}
Modified: parole/trunk/parole/parole-player.h
===================================================================
--- parole/trunk/parole/parole-player.h 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-player.h 2009-07-31 21:33:33 UTC (rev 7882)
@@ -53,6 +53,8 @@
void parole_player_play_uri_disc (ParolePlayer *player,
const gchar *uri);
+void parole_player_terminate (ParolePlayer *player);
+
G_END_DECLS
#endif /* __PAROLE_PLAYER_H */
Modified: parole/trunk/parole/parole-rc-utils.c
===================================================================
--- parole/trunk/parole/parole-rc-utils.c 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-rc-utils.c 2009-07-31 21:33:33 UTC (rev 7882)
@@ -28,19 +28,15 @@
#include <glib.h>
-#include <libxfce4util/libxfce4util.h>
-
#include "parole-rc-utils.h"
-#define MEDIA_PLAYER_RESOURCE_FILE "xfce4/parole/parole-media-player.rc"
-#define HISTORY_FILE "xfce4/parole/history"
-
-static XfceRc *
-open_resource_file (const gchar *group, gboolean readonly)
+XfceRc *
+parole_get_resource_file (const gchar *group, gboolean readonly)
{
gchar *file;
XfceRc *rc;
- file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, MEDIA_PLAYER_RESOURCE_FILE, TRUE);
+
+ file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, PAROLE_RESOURCE_FILE, TRUE);
rc = xfce_rc_simple_open (file, readonly);
if (rc)
@@ -53,7 +49,7 @@
void parole_rc_write_entry_bool (const gchar *property, const gchar *group, gboolean value)
{
- XfceRc *rc = open_resource_file (group, FALSE);
+ XfceRc *rc = parole_get_resource_file (group, FALSE);
xfce_rc_write_bool_entry (rc, property, value);
xfce_rc_close (rc);
@@ -61,7 +57,7 @@
void parole_rc_write_entry_int (const gchar *property, const gchar *group, gint value)
{
- XfceRc *rc = open_resource_file (group, FALSE);
+ XfceRc *rc = parole_get_resource_file (group, FALSE);
xfce_rc_write_int_entry (rc, property, value);
xfce_rc_close (rc);
@@ -69,7 +65,7 @@
void parole_rc_write_entry_string (const gchar *property, const gchar *group, const gchar *value)
{
- XfceRc *rc = open_resource_file (group, FALSE);
+ XfceRc *rc = parole_get_resource_file (group, FALSE);
xfce_rc_write_entry (rc, property, value);
xfce_rc_close (rc);
@@ -77,7 +73,7 @@
void parole_rc_write_entry_list (const gchar *property, const gchar *group, gchar **value)
{
- XfceRc *rc = open_resource_file (group, FALSE);
+ XfceRc *rc = parole_get_resource_file (group, FALSE);
xfce_rc_write_list_entry (rc, property, value, ";");
xfce_rc_close (rc);
@@ -85,7 +81,7 @@
gboolean parole_rc_read_entry_bool (const gchar *property, const gchar *group, gboolean fallback)
{
- XfceRc *rc = open_resource_file (group, TRUE);
+ XfceRc *rc = parole_get_resource_file (group, TRUE);
gboolean ret_val = fallback;
if ( rc )
@@ -99,7 +95,7 @@
gint parole_rc_read_entry_int (const gchar *property, const gchar *group, gint fallback)
{
- XfceRc *rc = open_resource_file (group, TRUE);
+ XfceRc *rc = parole_get_resource_file (group, TRUE);
gint ret_val = fallback;
if ( rc )
@@ -114,7 +110,7 @@
const gchar *parole_rc_read_entry_string (const gchar *property, const gchar *group, const gchar *fallback)
{
const gchar *ret_val = fallback;
- XfceRc *rc = open_resource_file (group, TRUE);
+ XfceRc *rc = parole_get_resource_file (group, TRUE);
if ( rc )
{
@@ -128,7 +124,7 @@
gchar **parole_rc_read_entry_list (const gchar *property, const gchar *group)
{
gchar **ret_val = NULL;
- XfceRc *rc = open_resource_file (group, TRUE);
+ XfceRc *rc = parole_get_resource_file (group, TRUE);
if ( rc )
{
@@ -146,7 +142,7 @@
gchar *contents = NULL;
gsize length = 0;
- history = xfce_resource_lookup (XFCE_RESOURCE_CACHE, HISTORY_FILE);
+ history = xfce_resource_lookup (XFCE_RESOURCE_CACHE, PAROLE_HISTORY_FILE);
if (history && g_file_get_contents (history, &contents, &length, NULL))
{
@@ -163,7 +159,7 @@
{
gchar *history = NULL;
- history = xfce_resource_save_location (XFCE_RESOURCE_CACHE, HISTORY_FILE, TRUE);
+ history = xfce_resource_save_location (XFCE_RESOURCE_CACHE, PAROLE_HISTORY_FILE, TRUE);
if ( history )
{
Modified: parole/trunk/parole/parole-rc-utils.h
===================================================================
--- parole/trunk/parole/parole-rc-utils.h 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-rc-utils.h 2009-07-31 21:33:33 UTC (rev 7882)
@@ -21,9 +21,17 @@
#ifndef __RC_UTILS_
#define __RC_UTILS_
+#include <libxfce4util/libxfce4util.h>
+
+#define PAROLE_RESOURCE_FILE "xfce4/parole/parole-media-player.rc"
+#define PAROLE_HISTORY_FILE "xfce4/parole/history"
+
#define PAROLE_RC_GROUP_GENERAL "General"
#define PAROLE_RC_GROUP_PLUGINS "Plugins"
+XfceRc *parole_get_resource_file (const gchar *group,
+ gboolean readonly);
+
void parole_rc_write_entry_bool (const gchar *property,
const gchar *group,
gboolean value);
Modified: parole/trunk/parole/parole-stream.c
===================================================================
--- parole/trunk/parole/parole-stream.c 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-stream.c 2009-07-31 21:33:33 UTC (rev 7882)
@@ -59,7 +59,8 @@
gint video_w;
gint video_h;
gint64 absolute_duration;
-
+ guint tracks;
+ guint track;
gchar *title;
gchar *artist;
gchar *year;
@@ -78,6 +79,8 @@
PROP_HAS_AUDIO,
PROP_HAS_VIDEO,
PROP_SEEKABLE,
+ PROP_TRACKS,
+ PROP_TRACK,
PROP_TAG_AVAILABLE,
PROP_DURATION,
PROP_ABSOLUTE_DURATION,
@@ -109,6 +112,8 @@
type = PAROLE_MEDIA_TYPE_SVCD;
else if ( g_str_has_prefix (uri, "cdda:/") )
type = PAROLE_MEDIA_TYPE_CDDA;
+ else if ( g_str_has_prefix (uri, "dvb:/") )
+ type = PAROLE_MEDIA_TYPE_DVB;
else
type = PAROLE_MEDIA_TYPE_UNKNOWN;
@@ -151,6 +156,12 @@
case PROP_SEEKABLE:
PAROLE_STREAM_GET_PRIVATE (stream)->seekable = g_value_get_boolean (value);
break;
+ case PROP_TRACKS:
+ PAROLE_STREAM_GET_PRIVATE (stream)->tracks = g_value_get_uint (value);
+ break;
+ case PROP_TRACK:
+ PAROLE_STREAM_GET_PRIVATE (stream)->track = g_value_get_uint (value);
+ break;
case PROP_TAG_AVAILABLE:
PAROLE_STREAM_GET_PRIVATE (stream)->tag_available = g_value_get_boolean (value);
break;
@@ -218,6 +229,12 @@
case PROP_DURATION:
g_value_set_double (value, PAROLE_STREAM_GET_PRIVATE (stream)->duration);
break;
+ case PROP_TRACKS:
+ g_value_set_uint (value, PAROLE_STREAM_GET_PRIVATE (stream)->tracks);
+ break;
+ case PROP_TRACK:
+ g_value_set_uint (value, PAROLE_STREAM_GET_PRIVATE (stream)->track);
+ break;
case PROP_TAG_AVAILABLE:
g_value_set_double (value, PAROLE_STREAM_GET_PRIVATE (stream)->tag_available);
break;
@@ -431,8 +448,37 @@
0, G_MAXINT,
0,
G_PARAM_READWRITE));
+
+ /**
+ * ParoleStream:num-tracks:
+ *
+ * Number of tracks in the cdda source, only valid if
+ * ParoleStream:media-type: is PAROLE_MEDIA_TYPE_CDDA.
+ *
+ * Since: 0.1
+ **/
+ g_object_class_install_property (object_class,
+ PROP_TRACKS,
+ g_param_spec_uint ("num-tracks",
+ NULL, NULL,
+ 1, 99,
+ 1,
+ G_PARAM_READWRITE));
/**
+ * ParoleStream:track:
+ *
+ *
+ * Since: 0.1
+ **/
+ g_object_class_install_property (object_class,
+ PROP_TRACK,
+ g_param_spec_uint ("track",
+ NULL, NULL,
+ 1, 99,
+ 1,
+ G_PARAM_READWRITE));
+ /**
* ParoleStream:title:
*
*
@@ -536,6 +582,8 @@
priv->media_type = PAROLE_MEDIA_TYPE_UNKNOWN;
priv->video_h = 0;
priv->video_w = 0;
+ priv->tracks = 1;
+ priv->track = 1;
PAROLE_STREAM_FREE_STR_PROP (priv->title);
PAROLE_STREAM_FREE_STR_PROP (priv->uri);
Modified: parole/trunk/parole/parole-stream.h
===================================================================
--- parole/trunk/parole/parole-stream.h 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-stream.h 2009-07-31 21:33:33 UTC (rev 7882)
@@ -37,6 +37,7 @@
PAROLE_MEDIA_TYPE_VCD,
PAROLE_MEDIA_TYPE_SVCD,
PAROLE_MEDIA_TYPE_DVD,
+ PAROLE_MEDIA_TYPE_DVB,
PAROLE_MEDIA_TYPE_REMOTE
} ParoleMediaType;
Modified: parole/trunk/parole/parole-utils.c
===================================================================
--- parole/trunk/parole/parole-utils.c 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/parole/parole-utils.c 2009-07-31 21:33:33 UTC (rev 7882)
@@ -350,8 +350,8 @@
gboolean
parole_is_uri_disc (const gchar *uri)
{
- if ( !g_strcmp0 (uri, "dvd:/") || !g_strcmp0 (uri, "vcd:/")
- || !g_strcmp0 (uri, "svcd:/") || !g_strcmp0 (uri, "cdda:/"))
+ if ( g_str_has_prefix (uri, "dvd:/") || g_str_has_prefix (uri, "vcd:/")
+ || g_str_has_prefix (uri, "svcd:/") || g_str_has_prefix (uri, "cdda:/"))
return TRUE;
else
return FALSE;
Modified: parole/trunk/po/parole-media-player.pot
===================================================================
--- parole/trunk/po/parole-media-player.pot 2009-07-31 20:18:30 UTC (rev 7881)
+++ parole/trunk/po/parole-media-player.pot 2009-07-31 21:33:33 UTC (rev 7882)
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-27 18:02+0200\n"
+"POT-Creation-Date: 2009-07-31 23:30+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
"Language-Team: LANGUAGE <LL at li.org>\n"
@@ -17,29 +17,106 @@
"Content-Transfer-Encoding: 8bit\n"
#: ../data/interfaces/parole.ui.h:1
+msgid "16:9 (Widescreen)"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:2
+msgid "20:9 (DVB)"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:3
+msgid "4:3 (TV)"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:4
+msgid "Aspect Ratio"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:5
+msgid "Auto"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:6
+msgid "Chapter Menu"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:7
+msgid "DVD Menu"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:8
msgid "Media player"
msgstr ""
-#: ../data/interfaces/parole.ui.h:2
+#: ../data/interfaces/parole.ui.h:9
+msgid "Mute"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:10 ../parole/parole-player.c:991
+msgid "Next Chapter"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:11
+msgid "None"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:12 ../data/desktop/parole.desktop.in.in.h:1
+#: ../parole/parole-player.c:220
+msgid "Parole Media Player"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:13
msgid "Plugins"
msgstr ""
-#: ../data/interfaces/parole.ui.h:3
+#: ../data/interfaces/parole.ui.h:14 ../parole/parole-player.c:1003
+msgid "Previous Chapter"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:15
+msgid "Repeat"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:16
+msgid "Shuffle"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:17
+msgid "Sound"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:18
+msgid "Square"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:19
+msgid "Volume Down"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:20
+msgid "Volume Up"
+msgstr ""
+
+#: ../data/interfaces/parole.ui.h:21
msgid "_Edit"
msgstr ""
-#: ../data/interfaces/parole.ui.h:4
+#: ../data/interfaces/parole.ui.h:22
msgid "_Help"
msgstr ""
-#: ../data/interfaces/parole.ui.h:5
+#: ../data/interfaces/parole.ui.h:23
msgid "_Media"
msgstr ""
-#: ../data/interfaces/parole.ui.h:6
+#: ../data/interfaces/parole.ui.h:24
msgid "_View"
msgstr ""
+#: ../data/interfaces/parole.ui.h:25
+msgid "gtk-leave-fullscreen"
+msgstr ""
+
#: ../data/interfaces/plugins.ui.h:1
msgid "<b>Author:</b>"
msgstr ""
@@ -85,7 +162,7 @@
msgstr ""
#: ../data/interfaces/parole-settings.ui.h:4
-msgid "Automatically load subtitle when playing movie file"
+msgid "Automatically load subtitles when playing movie file"
msgstr ""
#: ../data/interfaces/parole-settings.ui.h:5
@@ -93,25 +170,23 @@
msgstr ""
#: ../data/interfaces/parole-settings.ui.h:6
-msgid ""
-"Changing this will take effect after parole is restarted or a new media file "
-"is loaded."
+msgid "Contrast:"
msgstr ""
#: ../data/interfaces/parole-settings.ui.h:7
-msgid "Contrast:"
+msgid "Enable visualization when playing audio file"
msgstr ""
#: ../data/interfaces/parole-settings.ui.h:8
-msgid "Enable visualization when playing audio file"
+msgid "Encoding: "
msgstr ""
#: ../data/interfaces/parole-settings.ui.h:9
-msgid "Encoding: "
+msgid "Font:"
msgstr ""
#: ../data/interfaces/parole-settings.ui.h:10
-msgid "Font:"
+msgid "Hue:"
msgstr ""
#: ../data/interfaces/parole-settings.ui.h:11
@@ -123,6 +198,14 @@
msgstr ""
#: ../data/interfaces/parole-settings.ui.h:13
+msgid "Reset To Defaults"
+msgstr ""
+
+#: ../data/interfaces/parole-settings.ui.h:14
+msgid "Saturation:"
+msgstr ""
+
+#: ../data/interfaces/parole-settings.ui.h:15
msgid "Visualization type:"
msgstr ""
@@ -134,118 +217,136 @@
msgid "Select File Types (By Extension)"
msgstr ""
-#: ../data/desktop/parole.desktop.in.in.h:1 ../parole/parole-player.c:154
-msgid "Parole Media Player"
+#: ../parole/main.c:52
+#, c-format
+msgid ""
+"\n"
+"Parole Media Player %s\n"
+"\n"
+"Part of the Xfce Goodies Project\n"
+"http://goodies.xfce.org\n"
+"\n"
+"Licensed under the GNU GPL.\n"
+"\n"
msgstr ""
-#: ../parole/main.c:135
+#: ../parole/main.c:156
msgid "Open a new instance"
msgstr ""
-#: ../parole/main.c:136
+#: ../parole/main.c:157
+msgid "Version information"
+msgstr ""
+
+#: ../parole/main.c:158
msgid "Media to play"
msgstr ""
-#: ../parole/main.c:152
+#: ../parole/main.c:172
#, c-format
msgid "Type '%s --help' for usage."
msgstr ""
-#: ../parole/parole-gst.c:806
-msgid "Error in changing state to ready"
-msgstr ""
-
-#: ../parole/parole-gst.c:855
+#: ../parole/parole-gst.c:1271
msgid ""
"Unable to load playbin GStreamer plugin, check your GStreamer installation"
msgstr ""
-#: ../parole/parole-gst.c:870
+#: ../parole/parole-gst.c:1287
msgid ""
"Unable to load video GStreamer plugin, check your GStreamer installation"
msgstr ""
-#: ../parole/parole-mediachooser.c:171
+#: ../parole/parole-mediachooser.c:154
msgid "Add media files"
msgstr ""
-#: ../parole/parole-mediachooser.c:190
+#: ../parole/parole-mediachooser.c:173
msgid "Add"
msgstr ""
-#: ../parole/parole-mediachooser.c:210
-msgid "Open location..."
-msgstr ""
-
-#: ../parole/parole-mediachooser.c:212
-msgid "Open location of media file or live stream"
-msgstr ""
-
-#: ../parole/parole-medialist.c:380
+#: ../parole/parole-medialist.c:381
msgid "Error saving playlist file"
msgstr ""
-#: ../parole/parole-medialist.c:380
+#: ../parole/parole-medialist.c:381
msgid "Permission denied"
msgstr ""
-#: ../parole/parole-medialist.c:389
+#: ../parole/parole-medialist.c:390
msgid "Unknown playlist format, Please select a support playlist format"
msgstr ""
-#: ../parole/parole-medialist.c:455 ../parole/parole-player.c:963
+#: ../parole/parole-medialist.c:456 ../parole/parole-player.c:1461
msgid "Playlist"
msgstr ""
-#: ../parole/parole-medialist.c:462
+#: ../parole/parole-medialist.c:463
msgid "M3U Playlists"
msgstr ""
-#: ../parole/parole-medialist.c:470
+#: ../parole/parole-medialist.c:471
msgid "PLS Playlists"
msgstr ""
-#: ../parole/parole-medialist.c:478
+#: ../parole/parole-medialist.c:479
msgid "Advanced Stream Redirector"
msgstr ""
-#: ../parole/parole-medialist.c:486
+#: ../parole/parole-medialist.c:487
msgid "Shareable Playlist"
msgstr ""
-#: ../parole/parole-medialist.c:760
+#: ../parole/parole-medialist.c:788
msgid "Media list"
msgstr ""
-#: ../parole/parole-player.c:175
+#: ../parole/parole-player.c:283
msgid "Hide playlist"
msgstr ""
-#: ../parole/parole-player.c:184
+#: ../parole/parole-player.c:292
msgid "Show playlist"
msgstr ""
-#: ../parole/parole-player.c:338 ../parole/parole-statusbar.c:125
-#: ../parole/parole-statusbar.c:127
-msgid "Playing"
+#: ../parole/parole-player.c:501
+msgid "Media stream is not seekable"
msgstr ""
-#: ../parole/parole-player.c:339
-msgid "Media stream is not seekable"
+#.
+#. * Next chapter menu item
+#.
+#: ../parole/parole-player.c:991
+msgid "Next Track"
msgstr ""
-#: ../parole/parole-player.c:357 ../parole/parole-player.c:370
-msgid "Paused"
+#.
+#. * Previous chapter menu item
+#.
+#: ../parole/parole-player.c:1003
+msgid "Previous Track"
msgstr ""
-#: ../parole/parole-player.c:388
+#: ../parole/parole-statusbar.c:59
+msgid "Buffering"
+msgstr ""
+
+#: ../parole/parole-statusbar.c:76
msgid "Stopped"
msgstr ""
-#: ../parole/parole-statusbar.c:137
-msgid "Buffering"
+#: ../parole/parole-statusbar.c:80
+msgid "Finished"
msgstr ""
+#: ../parole/parole-statusbar.c:87 ../parole/parole-statusbar.c:95
+msgid "Paused"
+msgstr ""
+
+#: ../parole/parole-statusbar.c:116
+msgid "Live stream:"
+msgstr ""
+
#: ../parole/parole-filters.c:57
msgid "Audio"
msgstr ""
@@ -270,7 +371,7 @@
msgid "translator-credits"
msgstr ""
-#: ../parole/parole-disc.c:131
+#: ../parole/parole-disc.c:168
msgid "Play Disc"
msgstr ""
@@ -441,6 +542,14 @@
msgid "Vietnamese"
msgstr ""
+#: ../parole/parole-open-location.c:171
+msgid "Open location..."
+msgstr ""
+
+#: ../parole/parole-open-location.c:173
+msgid "Open location of media file or live stream"
+msgstr ""
+
#: ../plugins/properties/stream-properties.c:44
#: ../plugins/properties/stream-properties.c:45
#: ../plugins/properties/stream-properties.c:46
@@ -479,28 +588,28 @@
msgid "Read media properties"
msgstr ""
-#: ../plugins/tray/tray-icon.c:203
+#: ../plugins/tray/tray-icon.c:222
msgid "<b>Playing:</b>"
msgstr ""
-#: ../plugins/tray/tray-icon.c:203
+#: ../plugins/tray/tray-icon.c:222
msgid "<b>Duration:</b>"
msgstr ""
-#: ../plugins/tray/tray-icon.c:328
+#: ../plugins/tray/tray-icon.c:347
msgid "Tray icon plugin"
msgstr ""
-#: ../plugins/tray/tray-icon.c:337
+#: ../plugins/tray/tray-icon.c:356
msgid "Enable notification"
msgstr ""
#. Construct function
-#: ../plugins/tray/tray-icon.c:408
+#: ../plugins/tray/tray-icon.c:427
msgid "Tray icon"
msgstr ""
#. Title
-#: ../plugins/tray/tray-icon.c:409
+#: ../plugins/tray/tray-icon.c:428
msgid "Show icon in the system tray"
msgstr ""
More information about the Goodies-commits
mailing list