[Xfce4-commits] [apps/parole] 01/01: Add video sink selection to preferences, other is cluttersink experimental
noreply at xfce.org
noreply at xfce.org
Mon Jun 16 05:14:23 CEST 2014
This is an automated email from the git hooks/post-receive script.
bluesabre pushed a commit to branch master
in repository apps/parole.
commit b86a4a5825995ed62a392aa9432da0ae87226bd0
Author: Sean Davis <smd.seandavis at gmail.com>
Date: Sun Jun 15 23:14:17 2014 -0400
Add video sink selection to preferences, other is cluttersink experimental
---
data/interfaces/parole-settings.ui | 397 +++++++++++++++++++++++-------------
src/gst/parole-gst.c | 39 ++--
src/main.c | 36 ----
src/parole-conf-dialog.c | 221 ++++++++++++--------
src/parole-conf.c | 36 ++--
5 files changed, 435 insertions(+), 294 deletions(-)
diff --git a/data/interfaces/parole-settings.ui b/data/interfaces/parole-settings.ui
index b113224..d540184 100644
--- a/data/interfaces/parole-settings.ui
+++ b/data/interfaces/parole-settings.ui
@@ -14,6 +14,28 @@
<column type="gchararray"/>
</columns>
</object>
+ <object class="GtkListStore" id="liststore2">
+ <columns>
+ <!-- column-name sink_name -->
+ <column type="gchararray"/>
+ <!-- column-name sink_displayed -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0">xvimagesink</col>
+ <col id="1" translatable="yes">X Window System (X11/XShm/Xv)</col>
+ </row>
+ <row>
+ <col id="0">ximagesink</col>
+ <col id="1" translatable="yes">X Window System (No Xv)</col>
+ </row>
+ <row>
+ <col id="0">cluttersink</col>
+ <col id="1" translatable="yes">Other (Configure with Xfconf)</col>
+ </row>
+ </data>
+ </object>
<object class="XfceTitledDialog" id="settings-dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Parole Settings</property>
@@ -68,23 +90,25 @@
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="margin">12</property>
+ <property name="margin_left">12</property>
+ <property name="margin_right">24</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
<property name="orientation">vertical</property>
<property name="spacing">18</property>
<child>
<object class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="margin_bottom">6</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
- <property name="margin_right">12</property>
- <property name="margin_bottom">6</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="left_padding">12</property>
<property name="margin_top">6</property>
+ <property name="left_padding">12</property>
<child>
<object class="GtkBox" id="box7">
<property name="visible">True</property>
@@ -137,10 +161,9 @@
<object class="GtkFrame" id="frame2">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="margin_bottom">6</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
- <property name="margin_right">12</property>
- <property name="margin_bottom">6</property>
<child>
<object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
@@ -150,10 +173,10 @@
<object class="GtkBox" id="box2">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">6</property>
<property name="margin_top">6</property>
<property name="margin_bottom">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
<child>
<object class="GtkBox" id="box8">
<property name="visible">True</property>
@@ -256,16 +279,15 @@
<object class="GtkFrame" id="frame3">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="margin_bottom">6</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
- <property name="margin_right">12</property>
- <property name="margin_bottom">6</property>
<child>
<object class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="left_padding">12</property>
<property name="margin_top">6</property>
+ <property name="left_padding">12</property>
<child>
<object class="GtkBox" id="box9">
<property name="visible">True</property>
@@ -327,190 +349,273 @@
</packing>
</child>
<child>
- <object class="GtkFrame" id="frame-display">
+ <object class="GtkBox" id="box4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">12</property>
<property name="margin_right">24</property>
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">18</property>
<child>
- <object class="GtkAlignment" id="alignment4">
+ <object class="GtkFrame" id="frame4">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="left_padding">12</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <object class="GtkBox" id="box10">
+ <object class="GtkAlignment" id="alignment7">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="orientation">vertical</property>
+ <property name="left_padding">12</property>
<child>
- <object class="GtkGrid" id="grid1">
+ <object class="GtkBox" id="box11">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="margin_top">6</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
<child>
- <object class="GtkLabel" id="label9">
+ <object class="GtkComboBox" id="combobox-sink">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Brightness:</property>
+ <property name="model">liststore2</property>
+ <property name="button_sensitivity">on</property>
+ <signal name="changed" handler="parole_conf_dialog_sink_plugin_changed_cb" swapped="no"/>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
</object>
<packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="label10">
+ <object class="GtkLabel" id="label19">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes">Contrast:</property>
+ <property name="label" translatable="yes"><i>Changes to this field require Parole to be restarted.</i></property>
+ <property name="use_markup">True</property>
</object>
<packing>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
</packing>
</child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes"><b>Video Output</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame-display">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="box10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<child>
- <object class="GtkLabel" id="label11">
+ <object class="GtkGrid" id="grid1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Hue:</property>
+ <property name="margin_top">6</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Brightness:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Contrast:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Hue:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Saturation:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" id="brightness">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="draw_value">False</property>
+ <signal name="value-changed" handler="brightness_value_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" 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" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" 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" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" 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" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
</object>
<packing>
- <property name="left_attach">0</property>
- <property name="top_attach">3</property>
- <property name="width">1</property>
- <property name="height">1</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="label12">
+ <object class="GtkButtonBox" id="buttonbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Saturation:</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">2</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkScale" id="brightness">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hexpand">True</property>
- <property name="draw_value">False</property>
- <signal name="value-changed" handler="brightness_value_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkScale" 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" swapped="no"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkScale" 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" swapped="no"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">3</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkScale" 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" swapped="no"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">2</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButtonBox" id="buttonbox2">
- <property name="visible">True</property>
- <property name="can_focus">False</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">image2</property>
- <signal name="clicked" handler="reset_color_clicked_cb" swapped="no"/>
+ <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">image2</property>
+ <signal name="clicked" handler="reset_color_clicked_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="position">0</property>
+ <property name="position">1</property>
</packing>
</child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
</child>
</object>
</child>
+ <child type="label">
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes"><b>Color Balance</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
</object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label15">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label" translatable="yes"><b>Color Balance</b></property>
- <property name="use_markup">True</property>
- </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
<packing>
@@ -542,8 +647,8 @@
<object class="GtkAlignment" id="alignment5">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="left_padding">12</property>
<property name="margin_top">6</property>
+ <property name="left_padding">12</property>
<child>
<object class="GtkGrid" id="grid3">
<property name="visible">True</property>
@@ -783,7 +888,7 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="hexpand">True</property>
- <property name="font">Sans Bold 20</property>
+ <property name="font">Sans 12</property>
<property name="preview_text"/>
<property name="show_preview_entry">False</property>
<property name="use_font">True</property>
diff --git a/src/gst/parole-gst.c b/src/gst/parole-gst.c
index 9ab4387..1010e13 100644
--- a/src/gst/parole-gst.c
+++ b/src/gst/parole-gst.c
@@ -95,6 +95,13 @@ typedef enum
} GstPlayFlags;
+typedef enum
+{
+ XIMAGESINK,
+ XVIMAGESINK,
+ CLUTTERSINK
+} ParoleGstVideoSink;
+
struct ParoleGstPrivate
{
GstElement *playbin;
@@ -136,7 +143,7 @@ struct ParoleGstPrivate
/*
* xvimage sink has brightness+hue+saturation+contrast.
*/
- gboolean xvimage_sink;
+ ParoleGstVideoSink image_sink;
gulong sig1;
gulong sig2;
@@ -426,7 +433,7 @@ parole_gst_set_video_color_balance (ParoleGst *gst)
gint hue_value;
gint saturation_value;
- if ( !gst->priv->xvimage_sink)
+ if ( gst->priv->image_sink != XVIMAGESINK )
return;
g_object_get (G_OBJECT (gst->priv->playbin),
@@ -463,7 +470,7 @@ parole_gst_set_video_overlay (ParoleGst *gst)
GstElement *video_sink;
#if GTK_CHECK_VERSION(3,8,0)
#else
- gboolean enable_xv;
+ gchar *videosink;
#endif
g_object_get (G_OBJECT (gst->priv->playbin),
@@ -484,9 +491,9 @@ parole_gst_set_video_overlay (ParoleGst *gst)
#if GTK_CHECK_VERSION(3,8,0)
#else
g_object_get (G_OBJECT (gst->priv->conf),
- "enable-xv", &enable_xv,
+ "videosink", &videosink,
NULL);
- if (enable_xv)
+ if (g_strcmp0(videosink, "ximagesink") == 0)
{
g_object_set(video_sink, "autopaint-colorkey", FALSE,
"colorkey", 0x080810, NULL);
@@ -2147,12 +2154,12 @@ parole_gst_constructed (GObject *object)
{
ParoleGst *gst;
- gboolean enable_xv;
+ gchar *videosink = NULL;
gst = PAROLE_GST (object);
g_object_get (G_OBJECT (gst->priv->conf),
- "enable-xv", &enable_xv,
+ "videosink", &videosink,
NULL);
#if GST_CHECK_VERSION(1, 0, 0)
@@ -2191,16 +2198,22 @@ parole_gst_constructed (GObject *object)
g_error ("autoaudiosink load failed");
}
- if (enable_xv)
+ if (g_strcmp0(videosink, "xvimagesink") == 0)
{
gst->priv->video_sink = gst_element_factory_make ("xvimagesink", "video");
- gst->priv->xvimage_sink = TRUE;
+ gst->priv->image_sink = XVIMAGESINK;
+ }
+
+ if (g_strcmp0(videosink, "cluttersink") == 0)
+ {
+ gst->priv->video_sink = gst_element_factory_make ("cluttersink", "video");
+ gst->priv->image_sink = CLUTTERSINK;
}
if ( G_UNLIKELY (gst->priv->video_sink == NULL) )
{
- gst->priv->xvimage_sink = FALSE;
- g_debug ("%s trying to load ximagesink", enable_xv ? "xvimagesink not found " : "xv disabled ");
+ gst->priv->image_sink = XIMAGESINK;
+ g_debug ("%s trying to load ximagesink", g_strcmp0(videosink, "xvimagesink") ? "xvimagesink not found " : "xv disabled ");
gst->priv->video_sink = gst_element_factory_make ("ximagesink", "video");
if ( G_UNLIKELY (gst->priv->video_sink == NULL) )
@@ -2208,7 +2221,7 @@ parole_gst_constructed (GObject *object)
GError *error;
error = g_error_new (1, 0, _("Unable to load \"%s\" plugin"
", check your GStreamer installation."),
- enable_xv ? "xvimagesink" : "ximagesink");
+ videosink);
parole_gst_show_error (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gst))),
error);
g_error_free (error);
@@ -2779,7 +2792,7 @@ gint64 parole_gst_get_stream_position (ParoleGst *gst)
gboolean parole_gst_get_is_xvimage_sink (ParoleGst *gst)
{
- return gst->priv->xvimage_sink;
+ return gst->priv->image_sink == XVIMAGESINK;
}
void
diff --git a/src/main.c b/src/main.c
index 6ccfa12..f0ba015 100644
--- a/src/main.c
+++ b/src/main.c
@@ -209,41 +209,6 @@ parole_send_message (const gchar *message)
}
-/**
- * xv_option_given:
- * @name : name of the option.
- * @value : "TRUE"/"true" to enable xv hardware extensions or "FALSE"/"false" to
- * disable the xv hardware extensions.
- * @data : user-data passed by the callback function.
- * @error : a #GError to store encoutered errors.
- *
- * Toggle the XV hardware extension via cli argument.
- **/
-static gboolean
-xv_option_given (const gchar *name, const gchar *value, gpointer data, GError **error)
-{
- gboolean enabled = TRUE;
- ParoleConf *conf;
-
- if ( !g_strcmp0 (value, "TRUE") || !g_strcmp0 (value, "true"))
- enabled = TRUE;
- else if (!g_strcmp0 (value, "FALSE") || !g_strcmp0 (value, "false"))
- enabled = FALSE;
- else
- {
- g_set_error (error, 0, 0, "%s %s : %s", name, _("Unknown argument "), value);
- return FALSE;
- }
-
- conf = parole_conf_new ();
- g_object_set (G_OBJECT (conf),
- "enable-xv", enabled,
- NULL);
-
- g_object_unref(conf);
- exit (0);
-}
-
int main (int argc, char **argv)
{
ParolePlayer *player;
@@ -276,7 +241,6 @@ int main (int argc, char **argv)
{ "new-instance", 'i', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &new_instance, N_("Open a new instance"), NULL },
{ "no-plugins", 'n', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &no_plugins, N_("Do not load plugins"), NULL },
{ "device", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &device, N_("Set Audio-CD/VCD/DVD device path"), NULL },
- { "xv", '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_CALLBACK, (GOptionArgFunc) xv_option_given, N_("Enable/Disable XV support (true or false, default=true)"), NULL},
{ "embedded", 'E', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &embedded, N_("Start in embedded mode"), NULL },
{ "fullscreen", 'F', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &fullscreen, N_("Start in fullscreen mode"), NULL },
{ "play", 'p', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &play, N_("Play or pause if already playing"), NULL },
diff --git a/src/parole-conf-dialog.c b/src/parole-conf-dialog.c
index 00b7f2c..cc540ad 100644
--- a/src/parole-conf-dialog.c
+++ b/src/parole-conf-dialog.c
@@ -41,22 +41,26 @@
* GtkBuilder Callbacks
*/
-void parole_conf_dialog_response_cb (GtkDialog *dialog,
- gint response_id,
+void parole_conf_dialog_response_cb (GtkDialog *dialog,
+ gint response_id,
ParoleConfDialog *self);
-void
+void
parole_conf_dialog_vis_plugin_changed_cb (GtkComboBox *widget,
ParoleConfDialog *self);
+void
+parole_conf_dialog_sink_plugin_changed_cb (GtkComboBox *widget,
+ ParoleConfDialog *self);
+
void parole_conf_dialog_font_set_cb (GtkFontButton *button,
ParoleConfDialog *self);
-
+
void parole_conf_dialog_enable_vis_changed_cb (GObject *object,
GParamSpec *pspec,
gpointer *data);
-
-void
+
+void
parole_conf_dialog_subtitle_encoding_changed_cb (GtkComboBox *widget,
ParoleConfDialog *self);
@@ -72,9 +76,9 @@ void hue_value_changed_cb (GtkRange *range,
void saturation_value_changed_cb (GtkRange *range,
ParoleConfDialog *self);
-void reset_color_clicked_cb (GtkButton *button,
+void reset_color_clicked_cb (GtkButton *button,
ParoleConfDialog *self);
-
+
/*
* End of GtkBuilder callbacks
*/
@@ -85,10 +89,11 @@ void reset_color_clicked_cb (GtkButton *button,
struct ParoleConfDialogPrivate
{
ParoleConf *conf;
-
+
GHashTable *vis_plugins;
-
+
GtkWidget *vis_combox;
+ GtkWidget *sink_combox;
GtkWidget *toggle_vis;
GtkWidget *toggle_subtitle;
GtkWidget *font_button;
@@ -102,7 +107,7 @@ struct ParoleConfDialogPrivate
G_DEFINE_TYPE (ParoleConfDialog, parole_conf_dialog, G_TYPE_OBJECT)
/* Destroy the dialog */
-static void
+static void
parole_conf_dialog_destroy (GtkWidget *widget, ParoleConfDialog *self)
{
gtk_widget_hide(widget);
@@ -132,7 +137,7 @@ void parole_conf_dialog_response_cb (GtkDialog *dialog, gint response_id, Parole
/* Change subtitle encoding */
void parole_conf_dialog_subtitle_encoding_changed_cb (GtkComboBox *widget, ParoleConfDialog *self)
{
- g_object_set (G_OBJECT (self->priv->conf),
+ g_object_set (G_OBJECT (self->priv->conf),
"subtitle-encoding", parole_subtitle_encoding_get_selected (widget),
NULL);
}
@@ -145,7 +150,7 @@ void parole_conf_dialog_enable_vis_changed_cb (GObject *object,
gboolean active;
ParoleConfDialog *self;
self = PAROLE_CONF_DIALOG(data);
-
+
active = gtk_switch_get_active (GTK_SWITCH(GTK_WIDGET(object)));
gtk_widget_set_sensitive (self->priv->vis_combox, active);
@@ -156,10 +161,10 @@ 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),
+
+ g_object_set (G_OBJECT (self->priv->conf),
name, value,
NULL);
}
@@ -192,31 +197,53 @@ void parole_conf_dialog_vis_plugin_changed_cb (GtkComboBox *widget, ParoleConfD
{
gchar *active = NULL;
GstElementFactory *f;
-
+
GtkTreeIter iter;
GtkTreeModel *model = gtk_combo_box_get_model(widget);
-
+
if (gtk_combo_box_get_active_iter (widget, &iter))
gtk_tree_model_get (model, &iter, 0, &active, -1);
else
return;
-
+
f = g_hash_table_lookup (self->priv->vis_plugins, active);
-
+
if ( f )
{
g_object_set (G_OBJECT (self->priv->conf),
"vis-name", gst_object_get_name (GST_OBJECT (f)),
NULL);
}
-
+
+ g_free (active);
+}
+
+void parole_conf_dialog_sink_plugin_changed_cb (GtkComboBox *widget, ParoleConfDialog *self)
+{
+ gchar *active = NULL;
+
+ GtkTreeIter iter;
+ GtkTreeModel *model = gtk_combo_box_get_model(widget);
+
+ if (gtk_combo_box_get_active_iter (widget, &iter))
+ gtk_tree_model_get (model, &iter, 0, &active, -1);
+ else
+ return;
+
+ if (g_strcmp0(active, "other") != 0)
+ {
+ g_object_set (G_OBJECT (self->priv->conf),
+ "videosink", g_strdup(active),
+ NULL);
+ }
+
g_free (active);
}
/* Change subtitle font */
void parole_conf_dialog_font_set_cb (GtkFontButton *button, ParoleConfDialog *self)
{
- g_object_set (G_OBJECT (self->priv->conf),
+ g_object_set (G_OBJECT (self->priv->conf),
"subtitle-font", gtk_font_button_get_font_name (button),
NULL);
}
@@ -228,7 +255,7 @@ parole_conf_dialog_finalize (GObject *object)
ParoleConfDialog *self;
self = PAROLE_CONF_DIALOG (object);
-
+
g_object_unref (self->priv->conf);
g_hash_table_destroy (self->priv->vis_plugins);
@@ -252,7 +279,7 @@ parole_conf_dialog_init (ParoleConfDialog *self)
{
self->priv = PAROLE_CONF_DIALOG_GET_PRIVATE (self);
self->priv->conf = parole_conf_new ();
-
+
self->priv->vis_plugins = parole_vis_get_plugins ();
}
@@ -262,15 +289,15 @@ parole_conf_dialog_add_vis_plugins (gpointer key, gpointer value, GtkWidget *com
{
GtkListStore *store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(combox)));
GtkTreeIter iter;
-
+
gtk_list_store_append( store, &iter );
gtk_list_store_set( store, &iter, 0, (const gchar *) key, -1 );
-
+
g_object_unref (store);
}
/* Set the combobox to the default visualisation plugin */
-static gboolean
+static gboolean
parole_conf_dialog_set_default_vis_plugin (GtkTreeModel *model, GtkTreePath *path,
GtkTreeIter *iter, ParoleConfDialog *self)
{
@@ -278,17 +305,17 @@ parole_conf_dialog_set_default_vis_plugin (GtkTreeModel *model, GtkTreePath *pat
gchar *vis_name;
gchar *combox_text;
gboolean ret = FALSE;
-
+
g_object_get (G_OBJECT (self->priv->conf),
"vis-name", &vis_name,
NULL);
- gtk_tree_model_get (model, iter,
+ gtk_tree_model_get (model, iter,
0, &combox_text,
-1);
f = g_hash_table_lookup (self->priv->vis_plugins, combox_text);
-
+
if ( !g_strcmp0 (vis_name, "none") )
{
if ( !g_strcmp0 (gst_object_get_name (GST_OBJECT (f)), "Goom") )
@@ -298,10 +325,39 @@ parole_conf_dialog_set_default_vis_plugin (GtkTreeModel *model, GtkTreePath *pat
{
ret = TRUE;
}
-
+
if ( ret == TRUE )
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self->priv->vis_combox), iter);
-
+
+ return ret;
+}
+
+/* Set the combobox to the default sink plugin */
+static gboolean
+parole_conf_dialog_set_default_sink_plugin (ParoleConfDialog *self)
+{
+ gchar *sink_name;
+ gchar *combox_text;
+ gboolean ret = FALSE;
+
+ g_object_get (G_OBJECT (self->priv->conf),
+ "videosink", &sink_name,
+ NULL);
+
+ if (g_strcmp0(sink_name, "xvimagesink") == 0)
+ {
+ gtk_combo_box_set_active (GTK_COMBO_BOX (self->priv->sink_combox), 0);
+ return TRUE;
+ }
+
+ if (g_strcmp0(sink_name, "ximagesink") == 0)
+ {
+ gtk_combo_box_set_active (GTK_COMBO_BOX (self->priv->sink_combox), 1);
+ return TRUE;
+ }
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (self->priv->sink_combox), 2);
+
return ret;
}
@@ -313,7 +369,7 @@ parole_conf_dialog_set_defaults (ParoleConfDialog *self)
gboolean vis_enabled;
gchar *subtitle_font;
gchar *subtitle_encoding;
-
+
g_object_get (G_OBJECT (self->priv->conf),
"vis-enabled", &vis_enabled,
"subtitle-font", &subtitle_font,
@@ -322,17 +378,19 @@ parole_conf_dialog_set_defaults (ParoleConfDialog *self)
/* Update widget-states according to settings */
gtk_widget_set_sensitive (self->priv->vis_combox, vis_enabled);
-
+
model = gtk_combo_box_get_model (GTK_COMBO_BOX (self->priv->vis_combox));
- gtk_tree_model_foreach (model,
+ gtk_tree_model_foreach (model,
(GtkTreeModelForeachFunc) parole_conf_dialog_set_default_vis_plugin,
self);
-
+
+ parole_conf_dialog_set_default_sink_plugin (self);
+
parole_subtitle_encoding_set (GTK_COMBO_BOX (self->priv->encoding), subtitle_encoding);
-
+
gtk_font_button_set_font_name (GTK_FONT_BUTTON (self->priv->font_button), subtitle_font);
-
+
g_free (subtitle_font);
g_free (subtitle_encoding);
}
@@ -351,33 +409,34 @@ void parole_conf_dialog_open (ParoleConfDialog *self, GtkWidget *parent)
GtkWidget *dialog;
GtkWidget *combox;
gboolean with_display;
-
+
GtkWidget *switch_widget;
GtkAdjustment *adjustment;
GValue step_increment = {0};
-
+
builder = parole_builder_new_from_string (parole_settings_ui, parole_settings_ui_length);
-
+
dialog = GTK_WIDGET (gtk_builder_get_object (builder, "settings-dialog"));
combox = GTK_WIDGET (gtk_builder_get_object (builder, "vis-combobox"));
-
+
self->priv->toggle_vis = GTK_WIDGET (gtk_builder_get_object (builder, "enable-vis"));
self->priv->toggle_subtitle = GTK_WIDGET (gtk_builder_get_object (builder, "enable-subtitle"));
self->priv->font_button = GTK_WIDGET (gtk_builder_get_object (builder, "fontbutton"));
self->priv->encoding = GTK_WIDGET (gtk_builder_get_object (builder, "encoding"));
-
+
parole_subtitle_encoding_init (GTK_COMBO_BOX (self->priv->encoding));
-
+
g_hash_table_foreach (self->priv->vis_plugins, (GHFunc) parole_conf_dialog_add_vis_plugins, combox);
-
+
gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
-
+
self->priv->vis_combox = combox;
+ self->priv->sink_combox = GTK_WIDGET (gtk_builder_get_object (builder, "vis-combobox"));
parole_conf_dialog_set_defaults (self);
-
+
with_display = parole_gst_get_is_xvimage_sink (PAROLE_GST (parole_gst_get ()));
-
+
if ( !with_display )
{
gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "frame-display")));
@@ -388,12 +447,12 @@ void parole_conf_dialog_open (ParoleConfDialog *self, GtkWidget *parent)
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);
@@ -402,7 +461,7 @@ void parole_conf_dialog_open (ParoleConfDialog *self, GtkWidget *parent)
gtk_scale_add_mark (GTK_SCALE (self->priv->contrast), 0, GTK_POS_BOTTOM, NULL);
gtk_scale_add_mark (GTK_SCALE (self->priv->saturation), 0, GTK_POS_BOTTOM, NULL);
gtk_scale_add_mark (GTK_SCALE (self->priv->hue), 0, GTK_POS_BOTTOM, NULL);
-
+
/* Set the step increment on the sliders to make them keyboard friendly */
g_value_init(&step_increment, G_TYPE_DOUBLE);
g_value_set_double(&step_increment, 10.0);
@@ -421,69 +480,69 @@ void parole_conf_dialog_open (ParoleConfDialog *self, GtkWidget *parent)
"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);
-
+
}
-
+
/* General/Video/Disable screensaver while playing movies */
switch_widget = GTK_WIDGET (gtk_builder_get_object (builder, "reset-saver"));
- g_object_bind_property(G_OBJECT (self->priv->conf), "reset-saver",
- switch_widget, "active",
+ g_object_bind_property(G_OBJECT (self->priv->conf), "reset-saver",
+ switch_widget, "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
+
/* General/Audio/Enable visualization while playing audio file */
switch_widget = GTK_WIDGET (gtk_builder_get_object (builder, "enable-vis"));
- g_object_bind_property(G_OBJECT (self->priv->conf), "vis-enabled",
- switch_widget, "active",
+ g_object_bind_property(G_OBJECT (self->priv->conf), "vis-enabled",
+ switch_widget, "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
g_signal_connect(G_OBJECT(switch_widget), "notify::active", G_CALLBACK(parole_conf_dialog_enable_vis_changed_cb), self);
-
+
/* General/Keyboard/Enable keyboard multimedia keys */
switch_widget = GTK_WIDGET (gtk_builder_get_object (builder, "multimedia-keys"));
- g_object_bind_property(G_OBJECT (self->priv->conf), "multimedia-keys",
- switch_widget, "active",
+ g_object_bind_property(G_OBJECT (self->priv->conf), "multimedia-keys",
+ switch_widget, "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
+
/* Playlist/Always replace playlist with opened files */
switch_widget = GTK_WIDGET (gtk_builder_get_object (builder, "replace-playlist"));
- g_object_bind_property(G_OBJECT (self->priv->conf), "replace-playlist",
- switch_widget, "active",
+ g_object_bind_property(G_OBJECT (self->priv->conf), "replace-playlist",
+ switch_widget, "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
+
/* Playlist/Check and remove duplicate media entries */
switch_widget = GTK_WIDGET (gtk_builder_get_object (builder, "remove-duplicated"));
- g_object_bind_property(G_OBJECT (self->priv->conf), "remove-duplicated",
- switch_widget, "active",
+ g_object_bind_property(G_OBJECT (self->priv->conf), "remove-duplicated",
+ switch_widget, "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
+
/* Playlist/Start playing opened files */
switch_widget = GTK_WIDGET (gtk_builder_get_object (builder, "start-playing-opened"));
- g_object_bind_property(G_OBJECT (self->priv->conf), "play-opened-files",
- switch_widget, "active",
+ g_object_bind_property(G_OBJECT (self->priv->conf), "play-opened-files",
+ switch_widget, "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
+
/* Playlist/Remember playlist */
switch_widget = GTK_WIDGET (gtk_builder_get_object (builder, "remember-playlist"));
- g_object_bind_property(G_OBJECT (self->priv->conf), "remember-playlist",
- switch_widget, "active",
+ g_object_bind_property(G_OBJECT (self->priv->conf), "remember-playlist",
+ switch_widget, "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
+
/* Subtitles/Automatically show subtitles when playing movie file */
switch_widget = GTK_WIDGET (gtk_builder_get_object (builder, "enable-subtitle"));
- g_object_bind_property(G_OBJECT (self->priv->conf), "enable-subtitle",
- switch_widget, "active",
+ g_object_bind_property(G_OBJECT (self->priv->conf), "enable-subtitle",
+ switch_widget, "active",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
+
g_signal_connect(G_OBJECT(dialog), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), NULL);
-
+
gtk_builder_connect_signals (builder, self);
-
+
g_object_unref (builder);
-
+
gtk_widget_show (dialog);
}
diff --git a/src/parole-conf.c b/src/parole-conf.c
index 31cabc6..6335d33 100644
--- a/src/parole-conf.c
+++ b/src/parole-conf.c
@@ -69,11 +69,11 @@ enum
PROP_SUBTITLE_ENCODING,
PROP_SUBTITLE_FONT,
/* Video */
+ PROP_VIDEO_SINK,
PROP_ASPECT_RATIO,
PROP_BRIGHTNESS,
PROP_CONTRAST,
PROP_DISABLE_SCREEN_SAVER,
- PROP_ENABLE_XV,
PROP_HUE,
PROP_SATURATION,
/* Window properties */
@@ -297,6 +297,8 @@ gchar *parole_conf_map_xfconf_property_name (const gchar *prop_name)
value = g_strdup("subtitle-encoding");
if (g_strcmp0(prop_name, "/subtitles/font") == 0)
value = g_strdup("subtitle-font");
+ if (g_strcmp0(prop_name, "/video/videosink") == 0)
+ value = g_strdup("videosink");
if (g_strcmp0(prop_name, "/video/aspect-ratio") == 0)
value = g_strdup("aspect-ratio");
if (g_strcmp0(prop_name, "/video/brightness") == 0)
@@ -305,8 +307,6 @@ gchar *parole_conf_map_xfconf_property_name (const gchar *prop_name)
value = g_strdup("contrast");
if (g_strcmp0(prop_name, "/video/disable-screensaver") == 0)
value = g_strdup("reset-saver");
- if (g_strcmp0(prop_name, "/video/enable-xv") == 0)
- value = g_strdup("enable-xv");
if (g_strcmp0(prop_name, "/video/hue") == 0)
value = g_strdup("hue");
if (g_strcmp0(prop_name, "/video/saturation") == 0)
@@ -700,6 +700,21 @@ parole_conf_class_init (ParoleConfClass *klass)
G_PARAM_READWRITE));
/**
+ * ParoleConf:videosink:
+ *
+ * Xfconf property: /video/videosink
+ *
+ * GStreamer videosink to use for output.
+ **/
+ g_object_class_install_property (object_class,
+ PROP_VIDEO_SINK,
+ g_param_spec_string ("videosink",
+ "/video/videosink",
+ NULL,
+ "xvimagesink",
+ G_PARAM_READWRITE));
+
+ /**
* ParoleConf:aspect-ratio:
*
* Xfconf property: /video/aspect-ratio
@@ -765,21 +780,6 @@ parole_conf_class_init (ParoleConfClass *klass)
G_PARAM_READWRITE));
/**
- * ParoleConf:enable-xv:
- *
- * Xfconf property: /video/enable-xv
- *
- * Enable xv hardware extensions.
- **/
- g_object_class_install_property (object_class,
- PROP_ENABLE_XV,
- g_param_spec_boolean ("enable-xv",
- "/video/enable-xv",
- NULL,
- TRUE,
- G_PARAM_READWRITE));
-
- /**
* ParoleConf:hue:
*
* Xfconf property: /video/hue
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list