[Goodies-commits] r7859 - in parole/trunk: . data/interfaces parole
Ali Abdallah
aliov at xfce.org
Wed Jul 29 13:24:23 CEST 2009
Author: aliov
Date: 2009-07-29 11:24:23 +0000 (Wed, 29 Jul 2009)
New Revision: 7859
Modified:
parole/trunk/ChangeLog
parole/trunk/TODO
parole/trunk/data/interfaces/parole-settings.ui
parole/trunk/data/interfaces/parole.ui
parole/trunk/parole/parole-conf-dialog.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-gst.c
parole/trunk/parole/parole-gst.h
parole/trunk/parole/parole-player.c
Log:
* Better seeking capabilities with the slider and the buttons.
* Added some shortcut keys.
* Added volume in the menu bar.
* Added saturation+brightness+hue+contrast support
for the video image sink.
* Fix getting the date entity tag.
Modified: parole/trunk/ChangeLog
===================================================================
--- parole/trunk/ChangeLog 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/ChangeLog 2009-07-29 11:24:23 UTC (rev 7859)
@@ -1,3 +1,11 @@
+2009-07-29: Ali aliov at xfce.org
+ * Better seeking capabilities with the slider and the buttons.
+ * Added some shortcut keys.
+ * Added volume in the menu bar.
+ * Added saturation+brightness+hue+contrast support
+ for the video image sink.
+ * Fix getting the date entity tag.
+
2009-07-29: 09:30 Ali aliov at xfce.org
* Added ParoleDiscMenu to show a DVD menu when playing DVD.
* Query media capabilities on paused state.
Modified: parole/trunk/TODO
===================================================================
--- parole/trunk/TODO 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/TODO 2009-07-29 11:24:23 UTC (rev 7859)
@@ -1,7 +1,5 @@
=== Media player ===
-* Brightness and contrast support.
* Complete the shortcut keys.
-* Seek media on button release event on the range.
* Better support for cdda.
* Support some aspect ratio view.
* Handle missing gstreamer plugins.
Modified: parole/trunk/data/interfaces/parole-settings.ui
===================================================================
--- parole/trunk/data/interfaces/parole-settings.ui 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/data/interfaces/parole-settings.ui 2009-07-29 11:24:23 UTC (rev 7859)
@@ -102,7 +102,7 @@
</packing>
</child>
<child>
- <object class="GtkFrame" id="frame2">
+ <object class="GtkFrame" id="frame-display">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
@@ -111,58 +111,145 @@
<property name="visible">True</property>
<property name="left_padding">12</property>
<child>
- <object class="GtkTable" id="table1">
+ <object class="GtkVBox" id="vbox4">
<property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="column_spacing">5</property>
- <property name="row_spacing">5</property>
+ <property name="orientation">vertical</property>
<child>
- <object class="GtkLabel" id="label7">
+ <object class="GtkTable" id="table">
<property name="visible">True</property>
- <property name="label" translatable="yes">Brightness:</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">5</property>
+ <property name="row_spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Brightness:</property>
+ </object>
+ <packing>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Contrast:</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="brightness">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="draw_value">False</property>
+ <signal name="value_changed" handler="brightness_value_changed_cb"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="contrast">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="draw_value">False</property>
+ <signal name="value_changed" handler="contrast_value_changed_cb"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Hue:</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Saturation:</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="hue">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="draw_value">False</property>
+ <signal name="value_changed" handler="hue_value_changed_cb"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="saturation">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="draw_value">False</property>
+ <signal name="value_changed" handler="saturation_value_changed_cb"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
</object>
<packing>
- <property name="x_options"></property>
- <property name="y_options"></property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="label8">
+ <object class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
- <property name="label" translatable="yes">Contrast:</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="reset-color">
+ <property name="label" translatable="yes">Reset To Defaults</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="image">image1</property>
+ <signal name="clicked" handler="reset_color_clicked_cb"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
</object>
<packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options"></property>
- <property name="y_options"></property>
+ <property name="position">1</property>
</packing>
</child>
- <child>
- <object class="GtkHScale" id="brightness">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="draw_value">False</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkHScale" id="contrast">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="draw_value">False</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- </packing>
- </child>
</object>
</child>
</object>
@@ -338,4 +425,8 @@
<column type="gchararray"/>
</columns>
</object>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-undo</property>
+ </object>
</interface>
Modified: parole/trunk/data/interfaces/parole.ui
===================================================================
--- parole/trunk/data/interfaces/parole.ui 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/data/interfaces/parole.ui 2009-07-29 11:24:23 UTC (rev 7859)
@@ -134,6 +134,46 @@
</object>
</child>
<child>
+ <object class="GtkMenuItem" id="sound">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Sound</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkImageMenuItem" id="imagemenuitem1">
+ <property name="label" translatable="yes">Mute</property>
+ <property name="visible">True</property>
+ <property name="image">image12</property>
+ <property name="use_stock">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="imagemenuitem2">
+ <property name="label" translatable="yes">Volume Up</property>
+ <property name="visible">True</property>
+ <property name="image">image11</property>
+ <property name="use_stock">False</property>
+ <accelerator key="plus" signal="activate"/>
+ <signal name="activate" handler="parole_player_volume_up"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="imagemenuitem3">
+ <property name="label" translatable="yes">Volume Down</property>
+ <property name="visible">True</property>
+ <property name="image">image10</property>
+ <property name="use_stock">False</property>
+ <accelerator key="minus" signal="activate"/>
+ <signal name="activate" handler="parole_player_volume_down"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
<object class="GtkMenuItem" id="help-menu">
<property name="visible">True</property>
<property name="right_justified">True</property>
@@ -283,6 +323,7 @@
<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"/>
+ <signal name="scroll_event" handler="parole_player_scroll_event_cb"/>
</object>
<packing>
<property name="expand">False</property>
@@ -310,6 +351,7 @@
<property name="image">image6</property>
<property name="relief">none</property>
<property name="focus_on_click">False</property>
+ <signal name="clicked" handler="parole_player_seekb_cb"/>
</object>
<packing>
<property name="expand">False</property>
@@ -359,6 +401,7 @@
<property name="image">image9</property>
<property name="relief">none</property>
<property name="focus_on_click">False</property>
+ <signal name="clicked" handler="parole_player_seekf_cb"/>
</object>
<packing>
<property name="expand">False</property>
@@ -579,4 +622,16 @@
<property name="visible">True</property>
<property name="stock">gtk-go-forward</property>
</object>
+ <object class="GtkImage" id="image10">
+ <property name="visible">True</property>
+ <property name="icon_name">audio-volume-low</property>
+ </object>
+ <object class="GtkImage" id="image11">
+ <property name="visible">True</property>
+ <property name="icon_name">audio-volume-high</property>
+ </object>
+ <object class="GtkImage" id="image12">
+ <property name="visible">True</property>
+ <property name="icon_name">audio-volume-muted</property>
+ </object>
</interface>
Modified: parole/trunk/parole/parole-conf-dialog.c
===================================================================
--- parole/trunk/parole/parole-conf-dialog.c 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/parole/parole-conf-dialog.c 2009-07-29 11:24:23 UTC (rev 7859)
@@ -28,6 +28,7 @@
#include "interfaces/parole-settings_ui.h"
+#include "parole-gst.h"
#include "parole-builder.h"
#include "parole-conf-dialog.h"
#include "parole-conf.h"
@@ -56,6 +57,21 @@
void parole_conf_dialog_subtitle_encoding_changed_cb (GtkComboBox *widget,
ParoleConfDialog *self);
+
+void brightness_value_changed_cb (GtkRange *range,
+ ParoleConfDialog *self);
+
+void contrast_value_changed_cb (GtkRange *range,
+ ParoleConfDialog *self);
+
+void hue_value_changed_cb (GtkRange *range,
+ ParoleConfDialog *self);
+
+void saturation_value_changed_cb (GtkRange *range,
+ ParoleConfDialog *self);
+
+void reset_color_clicked_cb (GtkButton *button,
+ ParoleConfDialog *self);
/*
* End of GtkBuilder callbacks
*/
@@ -74,6 +90,10 @@
GtkWidget *toggle_subtitle;
GtkWidget *font_button;
GtkWidget *encoding;
+ GtkWidget *brightness;
+ GtkWidget *contrast;
+ GtkWidget *hue;
+ GtkWidget *saturation;
};
G_DEFINE_TYPE (ParoleConfDialog, parole_conf_dialog, G_TYPE_OBJECT)
@@ -85,6 +105,15 @@
g_object_unref (self);
}
+void reset_color_clicked_cb (GtkButton *button, ParoleConfDialog *self)
+{
+ gtk_range_set_value (GTK_RANGE (self->priv->brightness), 0);
+ gtk_range_set_value (GTK_RANGE (self->priv->contrast), 0);
+ gtk_range_set_value (GTK_RANGE (self->priv->hue), 0);
+ gtk_range_set_value (GTK_RANGE (self->priv->saturation), 0);
+
+}
+
void parole_conf_dialog_response_cb (GtkDialog *dialog, gint response_id, ParoleConfDialog *self)
{
switch (response_id)
@@ -117,6 +146,38 @@
gtk_widget_set_sensitive (self->priv->vis_combox, active);
}
+static void
+set_effect_value (ParoleConfDialog *self, GtkRange *range, const gchar *name)
+{
+ gint value;
+
+ value = gtk_range_get_value (range);
+
+ g_object_set (G_OBJECT (self->priv->conf),
+ name, value,
+ NULL);
+}
+
+void brightness_value_changed_cb (GtkRange *range, ParoleConfDialog *self)
+{
+ set_effect_value (self, range, "brightness");
+}
+
+void contrast_value_changed_cb (GtkRange *range, ParoleConfDialog *self)
+{
+ set_effect_value (self, range, "contrast");
+}
+
+void hue_value_changed_cb (GtkRange *range, ParoleConfDialog *self)
+{
+ set_effect_value (self, range, "hue");
+}
+
+void saturation_value_changed_cb (GtkRange *range, ParoleConfDialog *self)
+{
+ set_effect_value (self, range, "saturation");
+}
+
void parole_conf_dialog_vis_plugin_changed_cb (GtkComboBox *widget, ParoleConfDialog *self)
{
gchar *active;
@@ -279,6 +340,7 @@
GtkBuilder *builder;
GtkWidget *dialog;
GtkWidget *combox;
+ gboolean with_display;
builder = parole_builder_new_from_string (parole_settings_ui, parole_settings_ui_length);
@@ -300,8 +362,46 @@
parole_conf_dialog_set_defaults (self);
+ with_display = parole_gst_get_is_xvimage_sink (PAROLE_GST (parole_gst_new ()));
+
+ if ( !with_display )
+ {
+ gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "frame-display")));
+ }
+ else
+ {
+ gint brightness_value;
+ gint contrast_value;
+ gint hue_value;
+ gint saturation_value;
+
+ self->priv->brightness = GTK_WIDGET (gtk_builder_get_object (builder, "brightness"));
+ self->priv->contrast = GTK_WIDGET (gtk_builder_get_object (builder, "contrast"));
+ self->priv->hue = GTK_WIDGET (gtk_builder_get_object (builder, "hue"));
+ self->priv->saturation = GTK_WIDGET (gtk_builder_get_object (builder, "saturation"));
+
+ gtk_range_set_range (GTK_RANGE (self->priv->brightness), -1000, 1000);
+ gtk_range_set_range (GTK_RANGE (self->priv->contrast), -1000, 1000);
+ gtk_range_set_range (GTK_RANGE (self->priv->saturation), -1000, 1000);
+ gtk_range_set_range (GTK_RANGE (self->priv->hue), -1000, 1000);
+
+ g_object_get (G_OBJECT (self->priv->conf),
+ "brightness", &brightness_value,
+ "contrast", &contrast_value,
+ "hue", &hue_value,
+ "saturation", &saturation_value,
+ NULL);
+
+ gtk_range_set_value (GTK_RANGE (self->priv->brightness), brightness_value);
+ gtk_range_set_value (GTK_RANGE (self->priv->contrast), contrast_value);
+ gtk_range_set_value (GTK_RANGE (self->priv->hue), hue_value);
+ gtk_range_set_value (GTK_RANGE (self->priv->saturation), saturation_value);
+
+ }
+
gtk_builder_connect_signals (builder, self);
g_object_unref (builder);
- gtk_widget_show_all (dialog);
+
+ gtk_widget_show (dialog);
}
Modified: parole/trunk/parole/parole-conf.c
===================================================================
--- parole/trunk/parole/parole-conf.c 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/parole/parole-conf.c 2009-07-29 11:24:23 UTC (rev 7859)
@@ -44,6 +44,11 @@
gboolean repeat;
gboolean shuffle;
+
+ gint brightness;
+ gint contrast;
+ gint hue;
+ gint saturation;
};
static gpointer parole_conf_object = NULL;
@@ -59,7 +64,11 @@
PROP_SUBTITLE_FONT,
PROP_SUBTITLE_ENCODING,
PROP_REPEAT,
- PROP_SHUFFLE
+ PROP_SHUFFLE,
+ PROP_BRIGHTNESS,
+ PROP_CONTRAST,
+ PROP_HUE,
+ PROP_SATURATION
};
static void parole_conf_set_property (GObject *object,
@@ -74,49 +83,63 @@
{
case PROP_VIS_ENABLED:
conf->priv->enable_vis = g_value_get_boolean (value);
- g_object_notify (G_OBJECT (conf), "vis-enabled");
+ 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);
- g_object_notify (G_OBJECT (conf), "subtitle-encoding");
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);
- g_object_notify (G_OBJECT (conf), "vis-name");
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);
- g_object_notify (G_OBJECT (conf), "enable-subtitle");
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);
- 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;
+ 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;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
+ goto out;
}
+ g_object_notify (G_OBJECT (conf), pspec->name);
+
+out:
+ ;
}
static void parole_conf_get_property (GObject *object,
@@ -150,6 +173,18 @@
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;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -229,6 +264,41 @@
FALSE,
G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class,
+ PROP_CONTRAST,
+ g_param_spec_int ("contrast",
+ NULL, NULL,
+ -1000,
+ 1000,
+ 0,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class,
+ PROP_HUE,
+ g_param_spec_int ("hue",
+ NULL, NULL,
+ -1000,
+ 1000,
+ 0,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_SATURATION,
+ g_param_spec_int ("saturation",
+ NULL, NULL,
+ -1000,
+ 1000,
+ 0,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_BRIGHTNESS,
+ g_param_spec_int ("brightness",
+ NULL, NULL,
+ -1000,
+ 1000,
+ 0,
+ G_PARAM_READWRITE));
+
g_type_class_add_private (klass, sizeof (ParoleConfPrivate));
}
@@ -244,6 +314,10 @@
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);
}
ParoleConf *
Modified: parole/trunk/parole/parole-disc-menu.c
===================================================================
--- parole/trunk/parole/parole-disc-menu.c 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/parole/parole-disc-menu.c 2009-07-29 11:24:23 UTC (rev 7859)
@@ -174,3 +174,8 @@
menu = g_object_new (PAROLE_TYPE_DISC_MENU, NULL);
return menu;
}
+
+gboolean parole_disc_menu_visible (ParoleDiscMenu *menu)
+{
+ return (GTK_WIDGET_VISIBLE (menu->priv->next_chapter));
+}
Modified: parole/trunk/parole/parole-disc-menu.h
===================================================================
--- parole/trunk/parole/parole-disc-menu.h 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/parole/parole-disc-menu.h 2009-07-29 11:24:23 UTC (rev 7859)
@@ -46,6 +46,8 @@
ParoleDiscMenu *parole_disc_menu_new (void);
+gboolean parole_disc_menu_visible (ParoleDiscMenu *menu);
+
G_END_DECLS
#endif /* __PAROLE_DISC_MENU_H */
Modified: parole/trunk/parole/parole-gst.c
===================================================================
--- parole/trunk/parole/parole-gst.c 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/parole/parole-gst.c 2009-07-29 11:24:23 UTC (rev 7859)
@@ -70,9 +70,16 @@
GTimer *hidecursor_timer;
ParoleConf *conf;
- gboolean update;
+ gboolean update_vis;
gboolean with_vis;
gboolean buffering;
+ gboolean update_color_balance;
+
+
+ /*
+ * xvimage sink has brightness+hue+aturation+contrast.
+ */
+ gboolean xvimage_sink;
};
enum
@@ -263,6 +270,45 @@
}
static void
+parole_gst_set_video_color_balance (ParoleGst *gst)
+{
+ GstElement *video_sink;
+
+ gint brightness_value;
+ gint contrast_value;
+ gint hue_value;
+ gint saturation_value;
+
+ if ( !gst->priv->xvimage_sink )
+ return;
+
+ g_object_get (G_OBJECT (gst->priv->playbin),
+ "video-sink", &video_sink,
+ NULL);
+
+ if ( !video_sink )
+ return;
+
+ g_object_get (G_OBJECT (gst->priv->conf),
+ "brightness", &brightness_value,
+ "contrast", &contrast_value,
+ "hue", &hue_value,
+ "saturation", &saturation_value,
+ NULL);
+
+ g_object_set (G_OBJECT (video_sink),
+ "brightness", brightness_value,
+ "contrast", contrast_value,
+ "hue", hue_value,
+ "saturation", saturation_value,
+ NULL);
+
+ g_object_unref (G_OBJECT (video_sink));
+
+ gst->priv->update_color_balance = FALSE;
+}
+
+static void
parole_gst_set_x_overlay (ParoleGst *gst)
{
GstElement *video_sink;
@@ -581,7 +627,7 @@
gtk_widget_queue_draw (GTK_WIDGET (gst));
}
- gst->priv->update = FALSE;
+ gst->priv->update_vis = FALSE;
g_free (vis_name);
TRACE ("end");
}
@@ -612,13 +658,15 @@
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);
+
gst->priv->media_state = PAROLE_MEDIA_STATE_PAUSED;
g_signal_emit (G_OBJECT (gst), signals [MEDIA_STATE], 0,
gst->priv->stream, PAROLE_MEDIA_STATE_PAUSED);
break;
case GST_STATE_READY:
- if ( gst->priv->update)
+ if ( gst->priv->update_vis)
parole_gst_update_vis (gst);
gst->priv->media_state = PAROLE_MEDIA_STATE_STOPPED;
@@ -664,6 +712,7 @@
parole_gst_get_meta_data (ParoleGst *gst, GstTagList *tag)
{
gchar *str;
+ GDate *date;
if ( gst_tag_list_get_string_index (tag, GST_TAG_TITLE, 0, &str) )
{
@@ -683,12 +732,16 @@
g_free (str);
}
- if ( gst_tag_list_get_string_index (tag, GST_TAG_DATE, 0, &str) )
+ if ( gst_tag_list_get_date (tag, GST_TAG_DATE, &date) )
{
+
+ str = g_strdup_printf ("%d", g_date_get_year (date));
TRACE ("year:%s", str);
+
g_object_set (G_OBJECT (gst->priv->stream),
"year", str,
NULL);
+ g_date_free (date);
g_free (str);
}
@@ -930,9 +983,10 @@
}
gst->priv->video_sink = gst_element_factory_make ("xvimagesink", "video");
-
+ gst->priv->xvimage_sink = TRUE;
if ( G_UNLIKELY (gst->priv->video_sink == NULL) )
{
+ gst->priv->xvimage_sink = FALSE;
g_debug ("xvimagesink not found, trying to load ximagesink");
gst->priv->video_sink = gst_element_factory_make ("ximagesink", "video");
@@ -1073,11 +1127,9 @@
static void
parole_gst_conf_notify_cb (GObject *object, GParamSpec *spec, ParoleGst *gst)
{
- TRACE ("spec->name=%s\n", spec->name);
-
if ( !g_strcmp0 ("vis-enabled", spec->name) || !g_strcmp0 ("vis-name", spec->name) )
{
- gst->priv->update = TRUE;
+ gst->priv->update_vis = TRUE;
}
else if ( !g_strcmp0 ("subtitle-font", spec->name) || !g_strcmp0 ("enable-subtitle", spec->name) )
{
@@ -1087,6 +1139,14 @@
{
parole_gst_set_subtitle_encoding (gst);
}
+ else if ( !g_strcmp0 ("brightness", spec->name) || !g_strcmp0 ("hue", spec->name) ||
+ !g_strcmp0 ("contrast", spec->name) || !g_strcmp0 ("saturation", spec->name) )
+ {
+ gst->priv->update_color_balance = TRUE;
+
+ if ( gst->priv->state >= GST_STATE_PAUSED )
+ parole_gst_set_video_color_balance (gst);
+ }
}
static void
@@ -1171,9 +1231,10 @@
gst->priv->stream = parole_stream_new ();
gst->priv->tick_id = 0;
gst->priv->hidecursor_timer = g_timer_new ();
- gst->priv->update = FALSE;
+ gst->priv->update_vis = FALSE;
gst->priv->vis_sink = NULL;
gst->priv->buffering = FALSE;
+ gst->priv->update_color_balance = TRUE;
gst->priv->conf = parole_conf_new ();
@@ -1267,7 +1328,7 @@
parole_gst_change_state (gst, GST_STATE_READY);
}
-void parole_gst_null_state (ParoleGst *gst)
+void parole_gst_terminate (ParoleGst *gst)
{
g_mutex_lock (gst->priv->lock);
@@ -1359,3 +1420,31 @@
{
parole_gst_change_dvd_chapter (gst, -1);
}
+
+gdouble parole_gst_get_stream_duration (ParoleGst *gst)
+{
+ gdouble dur;
+
+ g_object_get (G_OBJECT (gst->priv->stream),
+ "duration", &dur,
+ NULL);
+ return dur;
+}
+
+gdouble parole_gst_get_stream_position (ParoleGst *gst)
+{
+ GstFormat format = GST_FORMAT_TIME;
+ gdouble value;
+ gint64 pos;
+
+ gst_element_query_position (gst->priv->playbin, &format, &pos);
+
+ value = ( pos / ((gdouble) 60 * 1000 * 1000 * 1000 ));
+
+ return value;
+}
+
+gboolean parole_gst_get_is_xvimage_sink (ParoleGst *gst)
+{
+ return gst->priv->xvimage_sink;
+}
Modified: parole/trunk/parole/parole-gst.h
===================================================================
--- parole/trunk/parole/parole-gst.h 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/parole/parole-gst.h 2009-07-29 11:24:23 UTC (rev 7859)
@@ -92,7 +92,7 @@
void parole_gst_stop (ParoleGst *gst);
-void parole_gst_null_state (ParoleGst *gst);
+void parole_gst_terminate (ParoleGst *gst);
void parole_gst_seek (ParoleGst *gst,
gdouble pos);
@@ -112,6 +112,12 @@
void parole_gst_prev_dvd_chapter (ParoleGst *gst);
+gdouble parole_gst_get_stream_duration (ParoleGst *gst);
+
+gdouble parole_gst_get_stream_position (ParoleGst *gst);
+
+gboolean parole_gst_get_is_xvimage_sink (ParoleGst *gst);
+
G_END_DECLS
#endif /* __PAROLE_GST_H */
Modified: parole/trunk/parole/parole-player.c
===================================================================
--- parole/trunk/parole/parole-player.c 2009-07-29 07:41:58 UTC (rev 7858)
+++ parole/trunk/parole/parole-player.c 2009-07-29 11:24:23 UTC (rev 7859)
@@ -70,6 +70,16 @@
void parole_player_stop_clicked (GtkButton *button,
ParolePlayer *player);
+void parole_player_seekf_cb (GtkButton *button,
+ ParolePlayer *player);
+
+void parole_player_seekb_cb (GtkButton *button,
+ ParolePlayer *player);
+
+gboolean parole_player_scroll_event_cb (GtkWidget *widget,
+ GdkEventScroll *ev,
+ ParolePlayer *player);
+
void parole_player_leave_fs_cb (GtkButton *button,
ParolePlayer *player);
@@ -93,6 +103,15 @@
void parole_player_menu_exit_cb (GtkWidget *widget,
ParolePlayer *player);
+void parole_player_volume_up (GtkWidget *widget,
+ ParolePlayer *player);
+
+void parole_player_volume_down (GtkWidget *widget,
+ ParolePlayer *player);
+
+void parole_player_volume_muted (GtkWidget *widget,
+ ParolePlayer *player);
+
void parole_player_open_preferences_cb (GtkWidget *widget,
ParolePlayer *player);
@@ -136,6 +155,8 @@
GtkWidget *show_hide_playlist;
GtkWidget *play_pause;
GtkWidget *stop;
+ GtkWidget *seekf;
+ GtkWidget *seekb;
GtkWidget *range;
GtkWidget *fs_window; /* Window for packing control widgets
@@ -206,7 +227,9 @@
parole_player_change_range_value (ParolePlayer *player, gdouble value)
{
player->priv->internal_range_change = TRUE;
+
gtk_range_set_value (GTK_RANGE (player->priv->range), value);
+
player->priv->internal_range_change = FALSE;
}
@@ -389,6 +412,8 @@
if ( seekable )
{
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);
}
else
{
@@ -452,6 +477,9 @@
parole_player_change_range_value (player, 0);
gtk_widget_set_sensitive (player->priv->range, FALSE);
+
+ gtk_widget_set_sensitive (player->priv->seekf, FALSE);
+ gtk_widget_set_sensitive (player->priv->seekb, FALSE);
parole_player_set_playpause_widget_image (player->priv->play_pause, GTK_STOCK_MEDIA_PLAY);
@@ -565,29 +593,79 @@
parole_gst_stop (PAROLE_GST (player->priv->gst));
}
+/*
+ * Seek 5%
+ */
+static gdouble
+parole_player_get_seek_value (ParolePlayer *player)
+{
+ gdouble val;
+ gdouble dur;
+
+ dur = parole_gst_get_stream_duration (PAROLE_GST (player->priv->gst));
+
+ val = dur * 5 /100;
+
+ return val;
+}
+
+void parole_player_seekf_cb (GtkButton *button, ParolePlayer *player)
+{
+ gdouble seek;
+
+ seek = parole_gst_get_stream_position (PAROLE_GST (player->priv->gst) )
+ +
+ parole_player_get_seek_value (player);
+
+ parole_gst_seek (PAROLE_GST (player->priv->gst), seek);
+}
+
+void parole_player_seekb_cb (GtkButton *button, ParolePlayer *player)
+{
+ gdouble seek;
+
+ seek = parole_gst_get_stream_position (PAROLE_GST (player->priv->gst) )
+ -
+ parole_player_get_seek_value (player);
+
+ parole_gst_seek (PAROLE_GST (player->priv->gst), seek);
+}
+
+gboolean parole_player_scroll_event_cb (GtkWidget *widget, GdkEventScroll *ev, ParolePlayer *player)
+{
+ gboolean ret_val = FALSE;
+
+ if ( ev->direction == GDK_SCROLL_UP )
+ {
+ parole_player_seekf_cb (NULL, player);
+ ret_val = TRUE;
+ }
+ else if ( ev->direction == GDK_SCROLL_DOWN )
+ {
+ parole_player_seekf_cb (NULL, player);
+ ret_val = TRUE;
+ }
+
+ return ret_val;
+}
+
gboolean
parole_player_range_button_release (GtkWidget *widget, GdkEventButton *ev, ParolePlayer *player)
{
- if ( ev->button == 3 )
- {
- player->priv->user_seeking = TRUE;
- }
+ ev->button = 2;
+ player->priv->user_seeking = FALSE;
+
return FALSE;
}
gboolean
parole_player_range_button_press (GtkWidget *widget, GdkEventButton *ev, ParolePlayer *player)
{
- gdouble value;
+ ev->button = 2;
- value = gtk_range_get_value (GTK_RANGE (player->priv->range));
+ player->priv->user_seeking = TRUE;
- if ( ev->button == 3 )
- {
- player->priv->user_seeking = FALSE;
- }
-
return FALSE;
}
@@ -653,7 +731,7 @@
parole_window_busy_cursor (GTK_WIDGET (player->priv->window)->window);
player->priv->exit = TRUE;
- parole_gst_null_state (PAROLE_GST (player->priv->gst));
+ parole_gst_terminate (PAROLE_GST (player->priv->gst));
return TRUE;
}
@@ -678,13 +756,13 @@
static void
parole_player_next_menu_item_activate (ParolePlayer *player)
{
-
+ parole_gst_next_dvd_chapter (PAROLE_GST (player->priv->gst));
}
static void
parole_player_previous_menu_item_activate (ParolePlayer *player)
{
-
+ parole_gst_prev_dvd_chapter (PAROLE_GST (player->priv->gst));
}
static void
@@ -766,9 +844,12 @@
static void
parole_player_show_menu (ParolePlayer *player, guint button, guint activate_time)
{
- GtkWidget *menu, *mi;
+ GtkWidget *menu, *mi, *img;
gboolean sensitive;
+ gboolean dvd_menu;
+ dvd_menu = parole_disc_menu_visible (player->priv->disc_menu);
+
menu = gtk_menu_new ();
/*Play menu item
@@ -787,6 +868,26 @@
G_CALLBACK (parole_player_play_menu_item_activate), player);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+ /*Seek Forward.
+ */
+ mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_FORWARD, NULL);
+
+ gtk_widget_set_sensitive (mi, (player->priv->state >= PAROLE_MEDIA_STATE_PAUSED));
+ gtk_widget_show (mi);
+ g_signal_connect (mi, "activate",
+ G_CALLBACK (parole_player_seekf_cb), player);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+
+ /*Seek backward.
+ */
+ mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_REWIND, NULL);
+
+ gtk_widget_set_sensitive (mi, (player->priv->state >= PAROLE_MEDIA_STATE_PAUSED));
+ gtk_widget_show (mi);
+ g_signal_connect (mi, "activate",
+ G_CALLBACK (parole_player_seekb_cb), player);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+
/*Stop menu item
*/
mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_STOP, NULL);
@@ -799,9 +900,10 @@
/*Next chapter menu item
*/
- mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_NEXT, NULL);
-
- gtk_widget_set_sensitive (mi, player->priv->state == PAROLE_MEDIA_STATE_PLAYING);
+ mi = gtk_image_menu_item_new_with_label (_("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);
gtk_widget_show (mi);
g_signal_connect_swapped (mi, "activate",
G_CALLBACK (parole_player_next_menu_item_activate), player);
@@ -809,9 +911,11 @@
/*Previous chapter menu item
*/
- mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_MEDIA_PREVIOUS, NULL);
+ mi = gtk_image_menu_item_new_with_label (_("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);
- gtk_widget_set_sensitive (mi, player->priv->state == PAROLE_MEDIA_STATE_PLAYING);
+ gtk_widget_set_sensitive (mi, (player->priv->state == PAROLE_MEDIA_STATE_PLAYING) && dvd_menu);
gtk_widget_show (mi);
g_signal_connect_swapped (mi, "activate",
G_CALLBACK (parole_player_previous_menu_item_activate), player);
@@ -987,6 +1091,27 @@
parole_rc_write_entry_int ("volume", PAROLE_RC_GROUP_GENERAL, (gint)(value * 100));
}
+void
+parole_player_volume_up (GtkWidget *widget, ParolePlayer *player)
+{
+ gdouble value;
+ value = gtk_range_get_value (GTK_RANGE (player->priv->volume));
+ gtk_range_set_value (GTK_RANGE (player->priv->volume), value + 0.1);
+}
+
+void
+parole_player_volume_down (GtkWidget *widget, ParolePlayer *player)
+{
+ gdouble value;
+ value = gtk_range_get_value (GTK_RANGE (player->priv->volume));
+ gtk_range_set_value (GTK_RANGE (player->priv->volume), value - 0.1);
+}
+
+void parole_player_volume_muted (GtkWidget *widget, ParolePlayer *player)
+{
+
+}
+
static void
parole_player_screen_size_change_changed_cb (GdkScreen *screen, ParolePlayer *player)
{
@@ -1028,13 +1153,40 @@
gboolean
parole_player_key_press (GtkWidget *widget, GdkEventKey *ev, ParolePlayer *player)
{
- if ( ev->keyval == GDK_F11 )
+ gboolean ret_val = FALSE;
+
+ switch (ev->keyval)
{
- parole_player_full_screen_menu_item_activate (player);
- return TRUE;
+ case GDK_F11:
+ parole_player_full_screen_menu_item_activate (player);
+ ret_val = TRUE;
+ break;
+ case GDK_plus :
+ parole_player_volume_up (NULL, player);
+ ret_val = TRUE;
+ break;
+ case GDK_minus:
+ parole_player_volume_down (NULL, player);
+ ret_val = TRUE;
+ break;
+ case GDK_Right:
+ /* Media seekable ?*/
+ if ( GTK_WIDGET_SENSITIVE (player->priv->range) )
+ parole_player_seekf_cb (NULL, player);
+ ret_val = TRUE;
+ break;
+ case GDK_Left:
+ if ( GTK_WIDGET_SENSITIVE (player->priv->range) )
+ parole_player_seekb_cb (NULL, player);
+ ret_val = TRUE;
+ break;
+ default:
+ break;
}
- return FALSE;
+ g_print ("Key Press 0x%X\n", ev->keyval);
+
+ return ret_val;
}
static void
@@ -1105,6 +1257,9 @@
player->priv->play_pause = GTK_WIDGET (gtk_builder_get_object (builder, "play-pause"));
player->priv->stop = GTK_WIDGET (gtk_builder_get_object (builder, "stop"));
+ player->priv->seekf = GTK_WIDGET (gtk_builder_get_object (builder, "forward"));
+ player->priv->seekb = GTK_WIDGET (gtk_builder_get_object (builder, "back"));
+
player->priv->range = GTK_WIDGET (gtk_builder_get_object (builder, "scale"));
player->priv->volume = GTK_WIDGET (gtk_builder_get_object (builder, "volume"));
More information about the Goodies-commits
mailing list