[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