File vinagre-bnc874407-add-advanced-options.patch of Package vinagre

diff -ur vinagre-3.10.2.orig/plugins/rdp/vinagre-rdp-connection.c vinagre-3.10.2/plugins/rdp/vinagre-rdp-connection.c
--- vinagre-3.10.2.orig/plugins/rdp/vinagre-rdp-connection.c	2013-07-30 02:43:09.000000000 -0500
+++ vinagre-3.10.2/plugins/rdp/vinagre-rdp-connection.c	2014-07-14 17:18:32.055878574 -0500
@@ -25,7 +25,13 @@
 
 struct _VinagreRdpConnectionPrivate
 {
-  gint dummy;
+  gchar *custom_options;
+};
+
+enum
+{
+  PROP_0,
+  PROP_CUSTOM_OPTIONS
 };
 
 #define VINAGRE_RDP_CONNECTION_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), VINAGRE_TYPE_RDP_CONNECTION, VinagreRdpConnectionPrivate))
@@ -44,25 +50,99 @@
 }
 
 static void
+vinagre_rdp_connection_finalize (GObject *object)
+{
+  VinagreRdpConnection *conn = VINAGRE_RDP_CONNECTION (object);
+
+  g_free (conn->priv->custom_options);
+
+  G_OBJECT_CLASS (vinagre_rdp_connection_parent_class)->finalize (object);
+}
+
+static void
+vinagre_rdp_connection_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+  VinagreRdpConnection *conn;
+
+  g_return_if_fail (VINAGRE_IS_RDP_CONNECTION (object));
+
+  conn = VINAGRE_RDP_CONNECTION (object);
+
+  switch (prop_id)
+    {
+    case PROP_CUSTOM_OPTIONS:
+      vinagre_rdp_connection_set_custom_options (conn, g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+vinagre_rdp_connection_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+  VinagreRdpConnection *conn;
+
+  g_return_if_fail (VINAGRE_IS_RDP_CONNECTION (object));
+
+  conn = VINAGRE_RDP_CONNECTION (object);
+
+  switch (prop_id)
+    {
+    case PROP_CUSTOM_OPTIONS:
+      g_value_set_string (value, conn->priv->custom_options);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
 rdp_fill_writer (VinagreConnection *conn, xmlTextWriter *writer)
 {
+  VinagreRdpConnection *rdp_conn = VINAGRE_RDP_CONNECTION (conn);
+
   VINAGRE_CONNECTION_CLASS (vinagre_rdp_connection_parent_class)->impl_fill_writer (conn, writer);
+
+  if (rdp_conn->priv->custom_options && *rdp_conn->priv->custom_options)
+    xmlTextWriterWriteFormatElement (writer, BAD_CAST "custom_options", "%s", rdp_conn->priv->custom_options);
 }
 
 static void
 rdp_parse_item (VinagreConnection *conn, xmlNode *root)
 {
+  xmlNode *curr;
+  xmlChar *s_value;
+  VinagreRdpConnection *rdp_conn = VINAGRE_RDP_CONNECTION (conn);
+
   VINAGRE_CONNECTION_CLASS (vinagre_rdp_connection_parent_class)->impl_parse_item (conn, root);
+
+  for (curr = root->children; curr; curr = curr->next)
+    {
+      s_value = xmlNodeGetContent (curr);
+
+      if (!xmlStrcmp(curr->name, BAD_CAST "custom_options"))
+	{
+	  vinagre_rdp_connection_set_custom_options (rdp_conn, (const gchar *)s_value);
+	}
+
+      xmlFree (s_value);
+    }
 }
 
 static void
 rdp_parse_options_widget (VinagreConnection *conn, GtkWidget *widget)
 {
-  GtkWidget *u_entry, *spin_button;
+  GtkWidget *u_entry, *spin_button, *custom_options;
   guint      width, height;
 
   u_entry = g_object_get_data (G_OBJECT (widget), "username_entry");
-  if (!u_entry)
+  custom_options = g_object_get_data (G_OBJECT (widget), "custom_options");
+  if (!u_entry || !custom_options)
     {
       g_warning ("Wrong widget passed to rdp_parse_options_widget()");
       return;
@@ -101,6 +181,12 @@
   vinagre_cache_prefs_set_integer  ("rdp-connection", "height", height);
 
   vinagre_connection_set_height (conn, height);
+
+  vinagre_cache_prefs_set_string  ("rdp-connection", "custom-options", gtk_entry_get_text (GTK_ENTRY (custom_options)));
+
+  g_object_set (conn,
+		"custom-options", gtk_entry_get_text (GTK_ENTRY (custom_options)),
+		NULL);
 }
 
 static void
@@ -111,11 +197,24 @@
 
   g_type_class_add_private (klass, sizeof (VinagreRdpConnectionPrivate));
 
+  object_class->finalize = vinagre_rdp_connection_finalize;
   object_class->constructed  = vinagre_rdp_connection_constructed;
+  object_class->get_property = vinagre_rdp_connection_get_property;
+  object_class->set_property = vinagre_rdp_connection_set_property;
 
   parent_class->impl_fill_writer = rdp_fill_writer;
   parent_class->impl_parse_item  = rdp_parse_item;
   parent_class->impl_parse_options_widget = rdp_parse_options_widget;
+
+  g_object_class_install_property (object_class,
+				   PROP_CUSTOM_OPTIONS,
+				   g_param_spec_string ("custom-options",
+							"Custom Options",
+							"custom options to pass to xfreerdp",
+							NULL,
+							G_PARAM_READWRITE |
+							G_PARAM_CONSTRUCT |
+							G_PARAM_STATIC_STRINGS));
 }
 
 VinagreConnection *
@@ -124,4 +223,20 @@
   return VINAGRE_CONNECTION (g_object_new (VINAGRE_TYPE_RDP_CONNECTION, NULL));
 }
 
+const gchar *
+vinagre_rdp_connection_get_custom_options (VinagreRdpConnection *conn)
+{
+  return conn->priv->custom_options;
+}
+
+void
+vinagre_rdp_connection_set_custom_options (VinagreRdpConnection *conn,
+					   const gchar *custom_options)
+{
+  g_return_if_fail (VINAGRE_IS_RDP_CONNECTION (conn));
+
+  g_free (conn->priv->custom_options);
+  conn->priv->custom_options = g_strdup (custom_options);
+}
+
 /* vim: set ts=8: */
diff -ur vinagre-3.10.2.orig/plugins/rdp/vinagre-rdp-connection.h vinagre-3.10.2/plugins/rdp/vinagre-rdp-connection.h
--- vinagre-3.10.2.orig/plugins/rdp/vinagre-rdp-connection.h	2013-07-02 09:14:35.000000000 -0500
+++ vinagre-3.10.2/plugins/rdp/vinagre-rdp-connection.h	2014-07-14 17:18:32.056878574 -0500
@@ -53,6 +53,11 @@
 
 VinagreConnection*  vinagre_rdp_connection_new (void);
 
+const gchar *    vinagre_rdp_connection_get_custom_options (VinagreRdpConnection *conn);
+
+void		    vinagre_rdp_connection_set_custom_options (VinagreRdpConnection *conn,
+							       const gchar *desktop_name);
+
 G_END_DECLS
 
 #endif /* __VINAGRE_RDP_CONNECTION_H__  */
diff -ur vinagre-3.10.2.orig/plugins/rdp/vinagre-rdp-plugin.c vinagre-3.10.2/plugins/rdp/vinagre-rdp-plugin.c
--- vinagre-3.10.2.orig/plugins/rdp/vinagre-rdp-plugin.c	2013-07-30 02:43:09.000000000 -0500
+++ vinagre-3.10.2/plugins/rdp/vinagre-rdp-plugin.c	2014-07-14 17:18:32.056878574 -0500
@@ -94,7 +94,7 @@
 static GtkWidget *
 impl_get_connect_widget (VinagreProtocol *plugin, VinagreConnection *conn)
 {
-  GtkWidget *grid, *label, *u_entry, *spin_button;
+  GtkWidget *grid, *label, *u_entry, *spin_button, *custom_options;
   gchar     *str;
 
   grid = gtk_grid_new ();
@@ -158,6 +158,24 @@
   gtk_label_set_mnemonic_widget (GTK_LABEL (label), spin_button);
   gtk_entry_set_activates_default (GTK_ENTRY (spin_button), TRUE);
 
+  /* custom options */
+  label = gtk_label_new_with_mnemonic (_("_Advanced options:"));
+  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+  gtk_grid_attach (GTK_GRID (grid), label, 0, 4, 1, 1);
+  gtk_widget_set_margin_left (label, 12);
+
+  custom_options = gtk_entry_new ();
+  /* Translators: This is the tooltip for the custom options field in a RDP connection */
+  gtk_widget_set_tooltip_text (custom_options, _("Optional. Additional parameters to pass to xfreerdp."));
+  g_object_set_data (G_OBJECT (grid), "custom_options", custom_options);
+  gtk_grid_attach (GTK_GRID (grid), custom_options, 1, 4, 1, 1);
+  gtk_label_set_mnemonic_widget (GTK_LABEL (label), custom_options);
+  str = g_strdup (VINAGRE_IS_CONNECTION (conn) ?
+		  vinagre_rdp_connection_get_custom_options (VINAGRE_RDP_CONNECTION (conn)) :
+		  vinagre_cache_prefs_get_string  ("rdp-connection", "custom-options", ""));
+  gtk_entry_set_text (GTK_ENTRY (custom_options), str);
+  gtk_entry_set_activates_default (GTK_ENTRY (custom_options), TRUE);
+  g_free (str);
 
   return grid;
 }
@@ -174,11 +192,6 @@
 }
 
 static void
-vinagre_rdp_plugin_class_finalize (VinagreRdpPluginClass *klass)
-{
-}
-
-static void
 vinagre_rdp_plugin_class_init (VinagreRdpPluginClass *klass)
 {
 }
diff -ur vinagre-3.10.2.orig/plugins/rdp/vinagre-rdp-tab.c vinagre-3.10.2/plugins/rdp/vinagre-rdp-tab.c
--- vinagre-3.10.2.orig/plugins/rdp/vinagre-rdp-tab.c	2013-09-02 14:50:36.000000000 -0500
+++ vinagre-3.10.2/plugins/rdp/vinagre-rdp-tab.c	2014-07-14 17:19:16.572875665 -0500
@@ -91,16 +91,26 @@
 {
   gchar **arg;
   const gchar *username;
-  gint i;
+  const gchar *custom_options;
+  gchar **custom_args = NULL;
+  gint custom_args_len;
+  gint i, j;
   GError *error = NULL;
   VinagreRdpTab *rdp_tab = VINAGRE_RDP_TAB (object);
   VinagreTab    *tab = VINAGRE_TAB (object);
   VinagreConnection *conn = vinagre_tab_get_conn (tab);
 
   username = vinagre_connection_get_username (conn);
-  i = 0;
+  custom_options = vinagre_rdp_connection_get_custom_options (VINAGRE_RDP_CONNECTION (conn));
+  if (custom_options)
+    custom_args = g_strsplit (custom_options, " ", 0);
 
-  arg = g_new (gchar *, 11);
+  i = j = custom_args_len = 0;
+
+  if (custom_args)
+    custom_args_len = g_strv_length (custom_args);
+
+  arg = g_new (gchar *, 11 + custom_args_len);
   arg[i++] = g_strdup ("xfreerdp");
 
   arg[i++] = g_strdup ("-K");
@@ -122,9 +132,13 @@
       arg[i++] = g_strdup (username);
     }
 
+  for (j = 0; j < custom_args_len; j++)
+    arg[i++] = g_strdup (custom_args[j]);
+
   arg[i++] = g_strdup_printf ("%s:%d",
 			      vinagre_connection_get_host (conn),
 			      vinagre_connection_get_port (conn));
+
   arg[i++] = NULL;
 
   if (!g_spawn_async (NULL,
@@ -152,6 +166,7 @@
 
 _end:
   g_strfreev (arg);
+  g_strfreev (custom_args);
 
   return FALSE;
 }
openSUSE Build Service is sponsored by