Index: configure.in
===================================================================
RCS file: /cvs/gnome/gnome-media/configure.in,v
retrieving revision 1.320
diff -u -r1.320 configure.in
--- configure.in	29 May 2006 17:20:23 -0000	1.320
+++ configure.in	21 Jul 2006 00:53:56 -0000
@@ -409,7 +409,7 @@
   COMMON_MODULES="gconf-2.0 libgnomeui-2.0 libglade-2.0 >= 1.99.12 gstreamer-$GST_MAJORMINOR"
   PKG_CHECK_MODULES(GSTPROPS, $COMMON_MODULES libxml-2.0 gnome-vfs-2.0,
   		  PROGRAMS_GSTPROPS="gstreamer-properties")
-  GSTPROPS_LIBS="$GSTPROPS_LIBS"
+  GSTPROPS_LIBS="$GSTPROPS_LIBS -lgstinterfaces-$GST_MAJORMINOR"
   AC_SUBST(GSTPROPS_LIBS)
   AC_SUBST(GSTPROPS_CFLAGS)
 
Index: gstreamer-properties/gstreamer-properties-structs.h
===================================================================
RCS file: /cvs/gnome/gnome-media/gstreamer-properties/gstreamer-properties-structs.h,v
retrieving revision 1.1
diff -u -r1.1 gstreamer-properties-structs.h
--- gstreamer-properties/gstreamer-properties-structs.h	1 Dec 2002 03:32:13 -0000	1.1
+++ gstreamer-properties/gstreamer-properties-structs.h	21 Jul 2006 00:53:57 -0000
@@ -51,6 +51,7 @@
 	gint index;         /* A storage spot for the index in the dropdown menu */
 	gchar *name;		/* English pipeline description */
 	gchar *pipeline;	/* gst-launch description of the pipeline */
+	gchar *device; /* Store device property setting */
 	gboolean is_custom;	/* Mark this entry as the 'custom' pipeline */
 	GSTPPipelineTestType test_type;
 	gchar *test_pipe;	/* Pipeline to connect to for testing */
@@ -65,9 +66,11 @@
 	gint cur_pipeline_index;
 	gchar *gconf_key;
 	gchar *optionmenu_name;
+	gchar *devicemenu_name;
 	gchar *entry_name;
 	gchar *test_button_name;
 	GtkOptionMenu *optionmenu;
+	GtkOptionMenu *devicemenu;
 	GtkEntry *entry;
 	GtkButton *test_button;
 }
Index: gstreamer-properties/gstreamer-properties.c
===================================================================
RCS file: /cvs/gnome/gnome-media/gstreamer-properties/gstreamer-properties.c,v
retrieving revision 1.18
diff -u -r1.18 gstreamer-properties.c
--- gstreamer-properties/gstreamer-properties.c	2 May 2006 15:56:02 -0000	1.18
+++ gstreamer-properties/gstreamer-properties.c	21 Jul 2006 00:53:57 -0000
@@ -34,6 +34,7 @@
 #include <gtk/gtk.h>
 #include <gconf/gconf-client.h>
 #include <gst/gst.h>
+#include <gst/interfaces/propertyprobe.h>
 #include "gstreamer-properties-structs.h"
 #include "pipeline-tests.h"
 
@@ -44,6 +45,7 @@
 
 static gchar pipeline_editor_property[] = "gstp-editor";
 static gchar pipeline_desc_property[] = "gstp-pipe-desc";
+static gchar device_property[] = "gstp-device";
 
 static gchar *
 gst_properties_gconf_get_full_key (const gchar * key)
@@ -120,6 +122,217 @@
 }
 
 static void
+pipeline_devicemenu_changed (GtkOptionMenu * devicemenu, gpointer user_data)
+{
+  GSTPPipelineEditor *editor = (GSTPPipelineEditor *) (user_data);
+  GtkMenu *menu = NULL;
+  GtkMenuItem *mi = NULL;
+  GSTPPipelineDescription *pipeline_desc = NULL;
+	gchar *devicename = NULL;
+
+  /* Determine which option changed, retrieve the pipeline desc,
+   * and call update_from_option */
+  menu = GTK_MENU (gtk_option_menu_get_menu (devicemenu));
+
+	if (menu == NULL)
+    return;
+
+  /*FIXME: g_return_if_fail (menu != NULL); */
+  mi = GTK_MENU_ITEM (gtk_menu_get_active (menu));
+
+	if (mi == NULL)
+		return;
+
+  devicename =
+      (gchar *) (g_object_get_data (G_OBJECT (mi),
+          device_property));
+
+  pipeline_desc =
+      (GSTPPipelineDescription *) (g_object_get_data (G_OBJECT (mi),
+          pipeline_desc_property));
+
+	if (pipeline_desc == NULL)
+    return;
+
+	pipeline_desc->device = devicename;
+
+  if (pipeline_desc->is_custom == FALSE) {
+		gchar *pipeline = gst_pipeline_string_from_desc (pipeline_desc);
+
+		if (pipeline)
+      gtk_entry_set_text (editor->entry, pipeline);
+    gtk_widget_set_sensitive (GTK_WIDGET (editor->entry), FALSE);
+
+    /* Update GConf */
+    gst_properties_gconf_set_string (editor->gconf_key, pipeline);
+  } else {
+    gtk_widget_set_sensitive (GTK_WIDGET (editor->entry), TRUE);
+  }
+}
+
+static void
+update_device_menu (GSTPPipelineEditor * editor,
+    GSTPPipelineDescription * pipeline_desc)
+{
+	/* Lots of gstreamer stuff */
+  GstElementFactory *factory;
+  GstElement *element;
+  GstPropertyProbe *probe;
+  const GParamSpec *pspec;
+  GObjectClass *klass;
+  const gchar *longname;	
+
+	if (editor->devicemenu == NULL) {
+    editor->devicemenu = GTK_OPTION_MENU (WID (editor->devicemenu_name));
+
+	  g_object_set_data (G_OBJECT (editor->devicemenu), pipeline_editor_property,
+	      (gpointer) (editor));
+	  g_signal_connect (G_OBJECT (editor->devicemenu), "changed",
+	      (GCallback) pipeline_devicemenu_changed, (gpointer) (editor));
+  }
+
+	if(editor->devicemenu) {
+    gchar *insensitive_label = g_strdup(_("None"));
+
+    gtk_widget_set_sensitive (GTK_WIDGET (editor->devicemenu), FALSE);
+
+	  gtk_option_menu_remove_menu (editor->devicemenu);
+
+	  GtkMenu *menu = GTK_MENU (gtk_menu_new ());
+	  GtkMenuItem *mi = NULL;
+		GtkMenuItem *mi_preselect = NULL;
+
+		if (pipeline_desc->is_custom == FALSE) {
+
+		  /* first see if we can actually create a device here */
+		  factory = gst_element_factory_find (pipeline_desc->pipeline);
+		  if (!factory) {
+		    GST_WARNING ("Failed to find factory for pipeline '%s'",
+		        pipeline_desc->pipeline);
+		    // return;
+		  }
+      else {
+			  element = gst_element_factory_create (factory, "test");
+			  longname = gst_element_factory_get_longname (factory);
+			  if (!element) {
+			    GST_WARNING ("Failed to create instance of factory '%s' (%s)",
+			        longname, GST_PLUGIN_FEATURE (factory)->name);
+			    //return;
+			  }
+        else {
+				  klass = G_OBJECT_GET_CLASS (element);  
+
+				  /* do we have a "device" property? */
+				  if (!g_object_class_find_property (klass, "device") ||
+				      !GST_IS_PROPERTY_PROBE (element) ||
+				      !(probe = GST_PROPERTY_PROBE (element)) ||
+				      !(pspec = gst_property_probe_get_property (probe, "device"))) {
+				    GST_DEBUG ("Found source '%s' (%s) - no device",
+				        longname, GST_PLUGIN_FEATURE (factory)->name);
+            g_free (insensitive_label);
+						/* Element does not support setting devices */
+						insensitive_label = g_strdup(_("Unsupported"));
+				  } else {
+					  gint n;
+					  gchar *name;
+					  GValueArray *array;
+
+            /* Set autoprobe[-fps] to FALSE to avoid delays when probing. */
+            if (g_object_class_find_property (klass, "autoprobe")) {
+              g_object_set (G_OBJECT (element), "autoprobe", FALSE, NULL);
+	            if (g_object_class_find_property (klass, "autoprobe-fps")) {
+	              g_object_set (G_OBJECT (element), "autoprobe-fps", FALSE, NULL);
+	            }
+            }
+
+				    array = gst_property_probe_probe_and_get_values (probe, pspec);
+				    if (array != NULL) {
+              /* default device item, so we can let the element handle it */
+				      if (array->n_values > 0) {
+								mi = GTK_MENU_ITEM (gtk_menu_item_new_with_label (_("Default")));
+					      g_object_set_data (G_OBJECT (mi), pipeline_desc_property,
+					          (gpointer) pipeline_desc);
+
+								gtk_widget_show (GTK_WIDGET (mi));
+								gtk_menu_shell_append (GTK_MENU_SHELL (menu), GTK_WIDGET (mi));
+
+				        gtk_widget_set_sensitive (GTK_WIDGET (editor->devicemenu), TRUE);
+              }
+
+				      for (n = 0; n < array->n_values; n++) {
+				        GValue *device;
+				        // GstCaps *caps;
+
+				        device = g_value_array_get_nth (array, n);
+				        g_object_set_property (G_OBJECT (element), "device", device);
+
+				        if (gst_element_set_state (element, GST_STATE_READY) !=
+				            GST_STATE_CHANGE_SUCCESS) {
+				          GST_WARNING
+				              ("Found source '%s' (%s) - device %s failed to open", longname,
+				              GST_PLUGIN_FEATURE (factory)->name,
+				              g_value_get_string (device));
+				          continue;
+				        }
+								
+				        g_object_get (G_OBJECT (element), "device-name", &name, NULL);
+				        // caps = gst_pad_get_caps (gst_element_get_pad (element, "src"));
+
+				        if (name == NULL)
+				          name = _("Unknown");
+
+				        GST_DEBUG ("Found source '%s' (%s) - device %s '%s'",
+				            longname, GST_PLUGIN_FEATURE (factory)->name,
+				            g_value_get_string (device), name);
+
+								gst_element_set_state (element, GST_STATE_NULL);
+
+				        /* Add device to devicemenu */
+								mi = GTK_MENU_ITEM (gtk_menu_item_new_with_label (name));		        
+								g_object_set_data (G_OBJECT (mi), device_property,
+					          (gpointer) g_value_get_string (device));
+					      g_object_set_data (G_OBJECT (mi), pipeline_desc_property,
+					          (gpointer) pipeline_desc);
+								gtk_widget_show (GTK_WIDGET (mi));
+								gtk_menu_shell_append (GTK_MENU_SHELL (menu), GTK_WIDGET (mi));
+                
+                if (pipeline_desc->device != NULL &&
+                   !strcmp (pipeline_desc->device, g_value_get_string(device)))
+                {
+                  mi_preselect = mi;
+                }
+				      }
+				    }
+				  }
+          gst_object_unref (GST_OBJECT (element));
+        }
+        gst_object_unref (GST_OBJECT (factory));
+      }
+	  }
+
+	  /* No devices to choose -> "None" */
+		if (mi == NULL) {
+				mi = GTK_MENU_ITEM (gtk_menu_item_new_with_label (g_strdup (insensitive_label)));
+
+	      g_object_set_data (G_OBJECT (mi), pipeline_desc_property,
+	          (gpointer) pipeline_desc);
+
+				gtk_widget_show (GTK_WIDGET (mi));
+				gtk_menu_shell_append (GTK_MENU_SHELL (menu), GTK_WIDGET (mi));
+    }
+
+		gtk_option_menu_set_menu (editor->devicemenu, GTK_WIDGET (menu));
+    
+    if (mi_preselect!=NULL) {
+      gtk_option_menu_set_history (editor->devicemenu,
+          g_list_index (GTK_MENU_SHELL (menu)->children, GTK_WIDGET (mi_preselect)));
+    }
+
+		g_free (insensitive_label);
+  }	
+}
+
+static void
 update_from_option (GSTPPipelineEditor * editor,
     GSTPPipelineDescription * pipeline_desc)
 {
@@ -130,14 +343,17 @@
 
   editor->cur_pipeline_index = pipeline_desc->index;
 
+	/* Update device list */
+	update_device_menu(editor, pipeline_desc);
+
   if (pipeline_desc->is_custom == FALSE) {
-    if (pipeline_desc->pipeline)
-      gtk_entry_set_text (editor->entry, pipeline_desc->pipeline);
+		gchar *pipeline = gst_pipeline_string_from_desc(pipeline_desc);
+    if (pipeline)
+      gtk_entry_set_text (editor->entry, pipeline);
     gtk_widget_set_sensitive (GTK_WIDGET (editor->entry), FALSE);
 
     /* Update GConf */
-    gst_properties_gconf_set_string (editor->gconf_key,
-        pipeline_desc->pipeline);
+    gst_properties_gconf_set_string (editor->gconf_key, pipeline);
   } else {
     gtk_widget_set_sensitive (GTK_WIDGET (editor->entry), TRUE);
   }
@@ -171,6 +387,12 @@
   gint custom_desc = -1;
 
   /* g_return_if_fail (editor != NULL); */
+	gchar **pipeline_nodes = g_strsplit (pipeline_str, " ", -1);
+	gchar *pipeline_device = NULL;
+	if (pipeline_nodes == NULL) {
+    pipeline_nodes[0] = (gchar*)pipeline_str;
+		pipeline_device = pipeline_nodes[1];
+  }
 
   editor->cur_pipeline_index = -1;
   for (i = 0; i < editor->n_pipeline_desc; i++) {
@@ -178,9 +400,13 @@
 
     if (pipeline_desc->is_custom == TRUE) {
       custom_desc = i;
-    } else if (!strcmp (pipeline_desc->pipeline, pipeline_str)) {
+    } else if (!strcmp (gst_pipeline_string_from_desc (pipeline_desc), pipeline_str)) {
       editor->cur_pipeline_index = i;
       break;
+    } else if (!strcmp (gst_pipeline_string_from_desc (pipeline_desc), pipeline_nodes[0])) {
+      editor->cur_pipeline_index = i;
+      pipeline_desc->device = gst_pipeline_string_get_property_value(pipeline_str, "device");
+      break;
     }
   }
 
@@ -201,6 +427,8 @@
     update_from_option (editor,
         editor->pipeline_desc + editor->cur_pipeline_index);
   }
+
+	g_strfreev(pipeline_nodes);
 }
 
 static void
Index: gstreamer-properties/gstreamer-properties.glade
===================================================================
RCS file: /cvs/gnome/gnome-media/gstreamer-properties/gstreamer-properties.glade,v
retrieving revision 1.7
diff -u -r1.7 gstreamer-properties.glade
--- gstreamer-properties/gstreamer-properties.glade	16 Jan 2006 23:34:24 -0000	1.7
+++ gstreamer-properties/gstreamer-properties.glade	21 Jul 2006 00:53:58 -0000
@@ -13,6 +13,13 @@
   <property name="modal">False</property>
   <property name="resizable">False</property>
   <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
   <property name="has_separator">False</property>
 
   <child internal-child="vbox">
@@ -34,6 +41,7 @@
 	      <property name="label">gtk-help</property>
 	      <property name="use_stock">True</property>
 	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
 	      <property name="response_id">-11</property>
 	    </widget>
 	  </child>
@@ -46,6 +54,7 @@
 	      <property name="label">gtk-close</property>
 	      <property name="use_stock">True</property>
 	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
 	      <property name="response_id">-7</property>
 	    </widget>
 	  </child>
@@ -88,7 +97,7 @@
 		  <child>
 		    <widget class="GtkLabel" id="audiosink_label">
 		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">&lt;b&gt;Default Output Plugin&lt;/b&gt;</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Default Output&lt;/b&gt;</property>
 		      <property name="use_underline">False</property>
 		      <property name="use_markup">True</property>
 		      <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -98,6 +107,10 @@
 		      <property name="yalign">0.5</property>
 		      <property name="xpad">0</property>
 		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
 		    </widget>
 		    <packing>
 		      <property name="left_attach">0</property>
@@ -123,6 +136,10 @@
 		      <property name="yalign">0.5</property>
 		      <property name="xpad">0</property>
 		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
 		    </widget>
 		    <packing>
 		      <property name="left_attach">0</property>
@@ -138,7 +155,7 @@
 		    <widget class="GtkTable" id="audiosink_inner_table">
 		      <property name="border_width">3</property>
 		      <property name="visible">True</property>
-		      <property name="n_rows">2</property>
+		      <property name="n_rows">3</property>
 		      <property name="n_columns">2</property>
 		      <property name="homogeneous">False</property>
 		      <property name="row_spacing">6</property>
@@ -147,7 +164,7 @@
 		      <child>
 			<widget class="GtkLabel" id="audiosink_output_label">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">_Output:</property>
+			  <property name="label" translatable="yes">_Plugin:</property>
 			  <property name="use_underline">True</property>
 			  <property name="use_markup">False</property>
 			  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -158,6 +175,10 @@
 			  <property name="xpad">0</property>
 			  <property name="ypad">0</property>
 			  <property name="mnemonic_widget">audiosink_optionmenu</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
 			</widget>
 			<packing>
 			  <property name="left_attach">0</property>
@@ -170,9 +191,24 @@
 		      </child>
 
 		      <child>
+			<widget class="GtkOptionMenu" id="audiosink_optionmenu">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="history">-1</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
 			<widget class="GtkLabel" id="audiosink_pipeline_label">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">_Pipeline:</property>
+			  <property name="label" translatable="yes">P_ipeline:</property>
 			  <property name="use_underline">True</property>
 			  <property name="use_markup">False</property>
 			  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -183,12 +219,16 @@
 			  <property name="xpad">0</property>
 			  <property name="ypad">0</property>
 			  <property name="mnemonic_widget">audiosink_pipeline_entry</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
 			</widget>
 			<packing>
 			  <property name="left_attach">0</property>
 			  <property name="right_attach">1</property>
-			  <property name="top_attach">1</property>
-			  <property name="bottom_attach">2</property>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
 			  <property name="x_options">fill</property>
 			  <property name="y_options"></property>
 			</packing>
@@ -209,7 +249,7 @@
 			      <property name="max_length">0</property>
 			      <property name="text" translatable="yes"></property>
 			      <property name="has_frame">True</property>
-			      <property name="invisible_char" translatable="yes">*</property>
+			      <property name="invisible_char">*</property>
 			      <property name="activates_default">False</property>
 			    </widget>
 			    <packing>
@@ -224,6 +264,7 @@
 			      <property name="visible">True</property>
 			      <property name="can_focus">True</property>
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
 
 			      <child>
 				<widget class="GtkAlignment" id="audiosink_test_button_alignment">
@@ -273,6 +314,10 @@
 					  <property name="yalign">0.5</property>
 					  <property name="xpad">0</property>
 					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
 					</widget>
 					<packing>
 					  <property name="padding">0</property>
@@ -295,24 +340,55 @@
 			<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>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
 			  <property name="x_options">fill</property>
 			  <property name="y_options">fill</property>
 			</packing>
 		      </child>
 
 		      <child>
-			<widget class="GtkOptionMenu" id="audiosink_optionmenu">
+			<widget class="GtkOptionMenu" id="audiosink_devicemenu">
 			  <property name="visible">True</property>
+			  <property name="sensitive">False</property>
 			  <property name="can_focus">True</property>
 			  <property name="history">-1</property>
 			</widget>
 			<packing>
 			  <property name="left_attach">1</property>
 			  <property name="right_attach">2</property>
-			  <property name="top_attach">0</property>
-			  <property name="bottom_attach">1</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="audiosink_device_label">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">_Device:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="mnemonic_widget">audiosink_devicemenu</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_options">fill</property>
 			  <property name="y_options"></property>
 			</packing>
 		      </child>
@@ -345,7 +421,7 @@
 		  <child>
 		    <widget class="GtkLabel" id="audiosrc_label">
 		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">&lt;b&gt;Default Input Plugin&lt;/b&gt;</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Default Input&lt;/b&gt;</property>
 		      <property name="use_underline">False</property>
 		      <property name="use_markup">True</property>
 		      <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -355,6 +431,10 @@
 		      <property name="yalign">0.5</property>
 		      <property name="xpad">0</property>
 		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
 		    </widget>
 		    <packing>
 		      <property name="left_attach">0</property>
@@ -380,6 +460,10 @@
 		      <property name="yalign">0.5</property>
 		      <property name="xpad">0</property>
 		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
 		    </widget>
 		    <packing>
 		      <property name="left_attach">0</property>
@@ -395,7 +479,7 @@
 		    <widget class="GtkTable" id="audiosrc_inner_table">
 		      <property name="border_width">3</property>
 		      <property name="visible">True</property>
-		      <property name="n_rows">2</property>
+		      <property name="n_rows">3</property>
 		      <property name="n_columns">2</property>
 		      <property name="homogeneous">False</property>
 		      <property name="row_spacing">6</property>
@@ -404,7 +488,7 @@
 		      <child>
 			<widget class="GtkLabel" id="audiosrc_input_label">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">_Input:</property>
+			  <property name="label" translatable="yes">P_lugin:</property>
 			  <property name="use_underline">True</property>
 			  <property name="use_markup">False</property>
 			  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -415,6 +499,10 @@
 			  <property name="xpad">0</property>
 			  <property name="ypad">0</property>
 			  <property name="mnemonic_widget">audiosrc_optionmenu</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
 			</widget>
 			<packing>
 			  <property name="left_attach">0</property>
@@ -427,9 +515,24 @@
 		      </child>
 
 		      <child>
+			<widget class="GtkOptionMenu" id="audiosrc_optionmenu">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="history">-1</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
 			<widget class="GtkLabel" id="audiosrc_pipeline_label">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">Pipe_line:</property>
+			  <property name="label" translatable="yes">Pipeli_ne:</property>
 			  <property name="use_underline">True</property>
 			  <property name="use_markup">False</property>
 			  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -440,12 +543,16 @@
 			  <property name="xpad">0</property>
 			  <property name="ypad">0</property>
 			  <property name="mnemonic_widget">audiosrc_pipeline_entry</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
 			</widget>
 			<packing>
 			  <property name="left_attach">0</property>
 			  <property name="right_attach">1</property>
-			  <property name="top_attach">1</property>
-			  <property name="bottom_attach">2</property>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
 			  <property name="x_options">fill</property>
 			  <property name="y_options"></property>
 			</packing>
@@ -466,7 +573,7 @@
 			      <property name="max_length">0</property>
 			      <property name="text" translatable="yes"></property>
 			      <property name="has_frame">True</property>
-			      <property name="invisible_char" translatable="yes">*</property>
+			      <property name="invisible_char">*</property>
 			      <property name="activates_default">False</property>
 			    </widget>
 			    <packing>
@@ -531,6 +638,10 @@
 					  <property name="yalign">0.5</property>
 					  <property name="xpad">0</property>
 					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
 					</widget>
 					<packing>
 					  <property name="padding">0</property>
@@ -553,24 +664,55 @@
 			<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>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
 			  <property name="x_options">fill</property>
 			  <property name="y_options">fill</property>
 			</packing>
 		      </child>
 
 		      <child>
-			<widget class="GtkOptionMenu" id="audiosrc_optionmenu">
+			<widget class="GtkOptionMenu" id="audiosrc_devicemenu">
 			  <property name="visible">True</property>
+			  <property name="sensitive">False</property>
 			  <property name="can_focus">True</property>
 			  <property name="history">-1</property>
 			</widget>
 			<packing>
 			  <property name="left_attach">1</property>
 			  <property name="right_attach">2</property>
-			  <property name="top_attach">0</property>
-			  <property name="bottom_attach">1</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="audiosrc_device_label">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">D_evice:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="mnemonic_widget">audiosink_devicemenu</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_options">fill</property>
 			  <property name="y_options"></property>
 			</packing>
 		      </child>
@@ -610,6 +752,10 @@
 	      <property name="yalign">0.5</property>
 	      <property name="xpad">0</property>
 	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
 	    </widget>
 	    <packing>
 	      <property name="type">tab</property>
@@ -635,7 +781,7 @@
 		  <child>
 		    <widget class="GtkLabel" id="videosink_label">
 		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">&lt;b&gt;Default Output Plugin&lt;/b&gt;</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Default Output&lt;/b&gt;</property>
 		      <property name="use_underline">False</property>
 		      <property name="use_markup">True</property>
 		      <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -645,6 +791,10 @@
 		      <property name="yalign">0.5</property>
 		      <property name="xpad">0</property>
 		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
 		    </widget>
 		    <packing>
 		      <property name="left_attach">0</property>
@@ -670,6 +820,10 @@
 		      <property name="yalign">0.5</property>
 		      <property name="xpad">0</property>
 		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
 		    </widget>
 		    <packing>
 		      <property name="left_attach">0</property>
@@ -685,7 +839,7 @@
 		    <widget class="GtkTable" id="videosink_inner_table">
 		      <property name="border_width">3</property>
 		      <property name="visible">True</property>
-		      <property name="n_rows">2</property>
+		      <property name="n_rows">3</property>
 		      <property name="n_columns">2</property>
 		      <property name="homogeneous">False</property>
 		      <property name="row_spacing">6</property>
@@ -694,7 +848,7 @@
 		      <child>
 			<widget class="GtkLabel" id="videosink_output_label">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">_Output:</property>
+			  <property name="label" translatable="yes">_Plugin:</property>
 			  <property name="use_underline">True</property>
 			  <property name="use_markup">False</property>
 			  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -705,6 +859,10 @@
 			  <property name="xpad">0</property>
 			  <property name="ypad">0</property>
 			  <property name="mnemonic_widget">audiosink_optionmenu</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
 			</widget>
 			<packing>
 			  <property name="left_attach">0</property>
@@ -717,26 +875,16 @@
 		      </child>
 
 		      <child>
-			<widget class="GtkLabel" id="videosink_pipeline_label">
+			<widget class="GtkOptionMenu" id="videosink_optionmenu">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">_Pipeline:</property>
-			  <property name="use_underline">True</property>
-			  <property name="use_markup">False</property>
-			  <property name="justify">GTK_JUSTIFY_LEFT</property>
-			  <property name="wrap">False</property>
-			  <property name="selectable">False</property>
-			  <property name="xalign">0</property>
-			  <property name="yalign">0.5</property>
-			  <property name="xpad">0</property>
-			  <property name="ypad">0</property>
-			  <property name="mnemonic_widget">videosink_pipeline_entry</property>
+			  <property name="can_focus">True</property>
+			  <property name="history">-1</property>
 			</widget>
 			<packing>
-			  <property name="left_attach">0</property>
-			  <property name="right_attach">1</property>
-			  <property name="top_attach">1</property>
-			  <property name="bottom_attach">2</property>
-			  <property name="x_options">fill</property>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
 			  <property name="y_options"></property>
 			</packing>
 		      </child>
@@ -756,7 +904,7 @@
 			      <property name="max_length">0</property>
 			      <property name="text" translatable="yes"></property>
 			      <property name="has_frame">True</property>
-			      <property name="invisible_char" translatable="yes">*</property>
+			      <property name="invisible_char">*</property>
 			      <property name="activates_default">False</property>
 			    </widget>
 			    <packing>
@@ -771,6 +919,7 @@
 			      <property name="visible">True</property>
 			      <property name="can_focus">True</property>
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
 
 			      <child>
 				<widget class="GtkAlignment" id="videosink_test_button_alignment">
@@ -779,6 +928,10 @@
 				  <property name="yalign">0.5</property>
 				  <property name="xscale">0</property>
 				  <property name="yscale">0</property>
+				  <property name="top_padding">0</property>
+				  <property name="bottom_padding">0</property>
+				  <property name="left_padding">0</property>
+				  <property name="right_padding">0</property>
 
 				  <child>
 				    <widget class="GtkHBox" id="videosink_test_button_hbox">
@@ -816,6 +969,10 @@
 					  <property name="yalign">0.5</property>
 					  <property name="xpad">0</property>
 					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
 					</widget>
 					<packing>
 					  <property name="padding">0</property>
@@ -838,24 +995,83 @@
 			<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>
+			  <property name="x_options">fill</property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="videosink_pipeline_label">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">P_ipeline:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="mnemonic_widget">videosink_pipeline_entry</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="videosink_device_label">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">_Device:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="mnemonic_widget">audiosink_devicemenu</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
 			  <property name="top_attach">1</property>
 			  <property name="bottom_attach">2</property>
 			  <property name="x_options">fill</property>
-			  <property name="y_options">fill</property>
+			  <property name="y_options"></property>
 			</packing>
 		      </child>
 
 		      <child>
-			<widget class="GtkOptionMenu" id="videosink_optionmenu">
+			<widget class="GtkOptionMenu" id="videosink_devicemenu">
 			  <property name="visible">True</property>
+			  <property name="sensitive">False</property>
 			  <property name="can_focus">True</property>
 			  <property name="history">-1</property>
 			</widget>
 			<packing>
 			  <property name="left_attach">1</property>
 			  <property name="right_attach">2</property>
-			  <property name="top_attach">0</property>
-			  <property name="bottom_attach">1</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
 			  <property name="y_options"></property>
 			</packing>
 		      </child>
@@ -888,7 +1104,7 @@
 		  <child>
 		    <widget class="GtkLabel" id="videosrc_label">
 		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">&lt;b&gt;Default Input Plugin&lt;/b&gt;</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Default Input&lt;/b&gt;</property>
 		      <property name="use_underline">False</property>
 		      <property name="use_markup">True</property>
 		      <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -898,6 +1114,10 @@
 		      <property name="yalign">0.5</property>
 		      <property name="xpad">0</property>
 		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
 		    </widget>
 		    <packing>
 		      <property name="left_attach">0</property>
@@ -923,6 +1143,10 @@
 		      <property name="yalign">0.5</property>
 		      <property name="xpad">0</property>
 		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
 		    </widget>
 		    <packing>
 		      <property name="left_attach">0</property>
@@ -938,7 +1162,7 @@
 		    <widget class="GtkTable" id="videosrc_inner_table">
 		      <property name="border_width">3</property>
 		      <property name="visible">True</property>
-		      <property name="n_rows">2</property>
+		      <property name="n_rows">3</property>
 		      <property name="n_columns">2</property>
 		      <property name="homogeneous">False</property>
 		      <property name="row_spacing">6</property>
@@ -947,7 +1171,7 @@
 		      <child>
 			<widget class="GtkLabel" id="videosrc_input_label">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">_Input:</property>
+			  <property name="label" translatable="yes">P_lugin:</property>
 			  <property name="use_underline">True</property>
 			  <property name="use_markup">False</property>
 			  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -958,6 +1182,10 @@
 			  <property name="xpad">0</property>
 			  <property name="ypad">0</property>
 			  <property name="mnemonic_widget">audiosrc_optionmenu</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
 			</widget>
 			<packing>
 			  <property name="left_attach">0</property>
@@ -970,26 +1198,16 @@
 		      </child>
 
 		      <child>
-			<widget class="GtkLabel" id="videosrc_pipeline_label">
+			<widget class="GtkOptionMenu" id="videosrc_optionmenu">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">Pipe_line:</property>
-			  <property name="use_underline">True</property>
-			  <property name="use_markup">False</property>
-			  <property name="justify">GTK_JUSTIFY_LEFT</property>
-			  <property name="wrap">False</property>
-			  <property name="selectable">False</property>
-			  <property name="xalign">0</property>
-			  <property name="yalign">0.5</property>
-			  <property name="xpad">0</property>
-			  <property name="ypad">0</property>
-			  <property name="mnemonic_widget">videosrc_pipeline_entry</property>
+			  <property name="can_focus">True</property>
+			  <property name="history">-1</property>
 			</widget>
 			<packing>
-			  <property name="left_attach">0</property>
-			  <property name="right_attach">1</property>
-			  <property name="top_attach">1</property>
-			  <property name="bottom_attach">2</property>
-			  <property name="x_options">fill</property>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
 			  <property name="y_options"></property>
 			</packing>
 		      </child>
@@ -1009,7 +1227,7 @@
 			      <property name="max_length">0</property>
 			      <property name="text" translatable="yes"></property>
 			      <property name="has_frame">True</property>
-			      <property name="invisible_char" translatable="yes">*</property>
+			      <property name="invisible_char">*</property>
 			      <property name="activates_default">False</property>
 			    </widget>
 			    <packing>
@@ -1024,6 +1242,7 @@
 			      <property name="visible">True</property>
 			      <property name="can_focus">True</property>
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
 
 			      <child>
 				<widget class="GtkAlignment" id="videosrc_test_button_alignment">
@@ -1032,6 +1251,10 @@
 				  <property name="yalign">0.5</property>
 				  <property name="xscale">0</property>
 				  <property name="yscale">0</property>
+				  <property name="top_padding">0</property>
+				  <property name="bottom_padding">0</property>
+				  <property name="left_padding">0</property>
+				  <property name="right_padding">0</property>
 
 				  <child>
 				    <widget class="GtkHBox" id="videosrc_test_button_hbox">
@@ -1069,6 +1292,10 @@
 					  <property name="yalign">0.5</property>
 					  <property name="xpad">0</property>
 					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
 					</widget>
 					<packing>
 					  <property name="padding">0</property>
@@ -1091,24 +1318,83 @@
 			<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>
+			  <property name="x_options">fill</property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="videosrc_pipeline_label">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">Pipeli_ne:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="mnemonic_widget">videosrc_pipeline_entry</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="videosrc_device_label">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">D_evice:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="mnemonic_widget">audiosink_devicemenu</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
 			  <property name="top_attach">1</property>
 			  <property name="bottom_attach">2</property>
 			  <property name="x_options">fill</property>
-			  <property name="y_options">fill</property>
+			  <property name="y_options"></property>
 			</packing>
 		      </child>
 
 		      <child>
-			<widget class="GtkOptionMenu" id="videosrc_optionmenu">
+			<widget class="GtkOptionMenu" id="videosrc_devicemenu">
 			  <property name="visible">True</property>
+			  <property name="sensitive">False</property>
 			  <property name="can_focus">True</property>
 			  <property name="history">-1</property>
 			</widget>
 			<packing>
 			  <property name="left_attach">1</property>
 			  <property name="right_attach">2</property>
-			  <property name="top_attach">0</property>
-			  <property name="bottom_attach">1</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
 			  <property name="y_options"></property>
 			</packing>
 		      </child>
@@ -1148,6 +1434,10 @@
 	      <property name="yalign">0.5</property>
 	      <property name="xpad">0</property>
 	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
 	    </widget>
 	    <packing>
 	      <property name="type">tab</property>
@@ -1174,6 +1464,13 @@
   <property name="modal">False</property>
   <property name="resizable">False</property>
   <property name="destroy_with_parent">True</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
   <property name="has_separator">False</property>
 
   <child internal-child="vbox">
@@ -1195,6 +1492,7 @@
 	      <property name="label">gtk-ok</property>
 	      <property name="use_stock">True</property>
 	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
 	      <property name="response_id">-5</property>
 	    </widget>
 	  </child>
@@ -1227,6 +1525,10 @@
 	      <property name="yalign">0.5</property>
 	      <property name="xpad">0</property>
 	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
 	    </widget>
 	    <packing>
 	      <property name="padding">0</property>
@@ -1263,6 +1565,10 @@
 	      <property name="yalign">0.5</property>
 	      <property name="xpad">0</property>
 	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
 	    </widget>
 	    <packing>
 	      <property name="padding">0</property>
Index: gstreamer-properties/pipeline-constants.c
===================================================================
RCS file: /cvs/gnome/gnome-media/gstreamer-properties/pipeline-constants.c,v
retrieving revision 1.14
diff -u -r1.14 pipeline-constants.c
--- gstreamer-properties/pipeline-constants.c	28 May 2006 14:14:53 -0000	1.14
+++ gstreamer-properties/pipeline-constants.c	21 Jul 2006 00:53:58 -0000
@@ -47,104 +47,104 @@
 extern GSTPPipelineDescription videosrc_pipelines[];
 
 GSTPPipelineDescription audiosink_pipelines[] = {
-  {PIPE_TYPE_AUDIOSINK, 0, "Autodetect", "autoaudiosink", FALSE,
+  {PIPE_TYPE_AUDIOSINK, 0, "Autodetect", "autoaudiosink", NULL, FALSE,
       TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
   {PIPE_TYPE_AUDIOSINK, 0, "ALSA - Advanced Linux Sound Architecture",
-      "alsasink", FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
+      "alsasink", NULL, FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
 #if 0
   {PIPE_TYPE_AUDIOSINK, 0,
         "ALSA - Advanced Linux Sound Architecture (Default Device)",
-      "alsasink", FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
+      "alsasink", NULL, FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
   {PIPE_TYPE_AUDIOSINK, 0,
         "ALSA - Advanced Linux Sound Architecture (Sound Card #1 Direct)",
-        "alsasink device=hw:0", FALSE, TEST_PIPE_SUPPLIED,
+        "alsasink device=hw:0", NULL, FALSE, TEST_PIPE_SUPPLIED,
       audiosink_test_pipe, FALSE},
   {PIPE_TYPE_AUDIOSINK, 0,
         "ALSA - Advanced Linux Sound Architecture (Sound Card #1 DMix)",
-        "alsasink device=dmix:0", FALSE, TEST_PIPE_SUPPLIED,
+        "alsasink device=dmix:0", NULL, FALSE, TEST_PIPE_SUPPLIED,
       audiosink_test_pipe, FALSE},
 #endif
   {PIPE_TYPE_AUDIOSINK, 0, "Artsd - ART Sound Daemon",
-      "artsdsink", FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
+      "artsdsink", NULL, FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
   {PIPE_TYPE_AUDIOSINK, 0, "ESD - Enlightenment Sound Daemon",
-      "esdsink", FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
+      "esdsink", NULL, FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
 #if 0                           /* Disabled this until it works */
-  {PIPE_TYPE_AUDIOSINK, 0, "Jack", "jackbin.( jacksink )", FALSE,
+  {PIPE_TYPE_AUDIOSINK, 0, "Jack", "jackbin.( jacksink )", NULL, FALSE,
       TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
 #endif
   {PIPE_TYPE_AUDIOSINK, 0, "OSS - Open Sound System",
-      "osssink", FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, TRUE},
+      "osssink", NULL, FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, TRUE},
   {PIPE_TYPE_AUDIOSINK, 0, "Polypaudio Sound Server",
-      "polypsink", FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
-  {PIPE_TYPE_AUDIOSINK, 0, N_("Custom"), NULL, TRUE, TEST_PIPE_SUPPLIED,
+      "polypsink", NULL, FALSE, TEST_PIPE_SUPPLIED, audiosink_test_pipe, FALSE},
+  {PIPE_TYPE_AUDIOSINK, 0, N_("Custom"), NULL, NULL, TRUE, TEST_PIPE_SUPPLIED,
       audiosink_test_pipe, TRUE}
 };
 
 GSTPPipelineDescription videosink_pipelines[] = {
-  {PIPE_TYPE_VIDEOSINK, 0, "Autodetect", "autovideosink", FALSE,
+  {PIPE_TYPE_VIDEOSINK, 0, "Autodetect", "autovideosink", NULL, FALSE,
       TEST_PIPE_SUPPLIED, videosink_test_pipe, FALSE},
 #if 0
   /*
    * aasink is disabled because it is not a serious alternative.
    */
-  {PIPE_TYPE_VIDEOSINK, 0, "Ascii Art - X11", "aasink driver=0", FALSE,
+  {PIPE_TYPE_VIDEOSINK, 0, "Ascii Art - X11", "aasink driver=0", NULL, FALSE,
       TEST_PIPE_SUPPLIED, videosink_test_pipe, FALSE},
-  {PIPE_TYPE_VIDEOSINK, 0, "Ascii Art - console", "aasink driver=1", FALSE,
+  {PIPE_TYPE_VIDEOSINK, 0, "Ascii Art - console", "aasink driver=1", NULL, FALSE,
       TEST_PIPE_SUPPLIED, videosink_test_pipe, FALSE},
 #endif
 #if 0
   /* Leaving this one disabled, because of a bug in cacasink that
    * pops up a window in NULL state
    */
-  {PIPE_TYPE_VIDEOSINK, 0, "Colour Ascii Art", "cacasink", FALSE,
+  {PIPE_TYPE_VIDEOSINK, 0, "Colour Ascii Art", "cacasink", NULL, FALSE,
       TEST_PIPE_SUPPLIED, videosink_test_pipe, FALSE},
 #endif
   {PIPE_TYPE_VIDEOSINK, 0, "SDL - Simple DirectMedia Layer", "sdlvideosink",
-      FALSE, TEST_PIPE_SUPPLIED, videosink_test_pipe, FALSE},
-  {PIPE_TYPE_VIDEOSINK, 0, "X Window System (No Xv)",
-      "ximagesink", FALSE, TEST_PIPE_SUPPLIED, videosink_test_pipe, FALSE},
-  {PIPE_TYPE_VIDEOSINK, 0, "X Window System (X11/XShm/Xv)", "xvimagesink", FALSE,
-      TEST_PIPE_SUPPLIED, videosink_test_pipe, FALSE},
-  {PIPE_TYPE_VIDEOSINK, 0, N_("Custom"), NULL, TRUE, TEST_PIPE_SUPPLIED,
+      NULL, FALSE, TEST_PIPE_SUPPLIED, videosink_test_pipe, FALSE},
+  {PIPE_TYPE_VIDEOSINK, 0, "X Window System (No Xv)", "ximagesink", 
+      NULL, FALSE, TEST_PIPE_SUPPLIED, videosink_test_pipe, FALSE},
+  {PIPE_TYPE_VIDEOSINK, 0, "X Window System (X11/XShm/Xv)", "xvimagesink",
+      NULL, FALSE, TEST_PIPE_SUPPLIED, videosink_test_pipe, FALSE},
+  {PIPE_TYPE_VIDEOSINK, 0, N_("Custom"), NULL, NULL, TRUE, TEST_PIPE_SUPPLIED,
       videosink_test_pipe, TRUE}
 };
 
 GSTPPipelineDescription audiosrc_pipelines[] = {
   {PIPE_TYPE_AUDIOSRC, 0, "ALSA - Advanced Linux Sound Architecture",
-      "alsasrc", FALSE, TEST_PIPE_AUDIOSINK, NULL, FALSE},
-  {PIPE_TYPE_AUDIOSRC, 0, "ESD - Enlightenment Sound Daemon", "esdmon",
+      "alsasrc", NULL, FALSE, TEST_PIPE_AUDIOSINK, NULL, FALSE},
+  {PIPE_TYPE_AUDIOSRC, 0, "ESD - Enlightenment Sound Daemon", "esdmon", NULL,
       FALSE, TEST_PIPE_AUDIOSINK, NULL, FALSE},
 #if 0                           /* Disabled this until it works */
-  {PIPE_TYPE_AUDIOSRC, 0, "Jack", "jackbin{ jacksrc }", FALSE,
+  {PIPE_TYPE_AUDIOSRC, 0, "Jack", "jackbin{ jacksrc }", NULL, FALSE,
         TEST_PIPE_AUDIOSINK,
       NULL, FALSE},
 #endif
-  {PIPE_TYPE_AUDIOSRC, 0, "OSS - Open Sound System", "osssrc", FALSE,
+  {PIPE_TYPE_AUDIOSRC, 0, "OSS - Open Sound System", "osssrc", NULL, FALSE,
       TEST_PIPE_AUDIOSINK, NULL, FALSE},
-  {PIPE_TYPE_AUDIOSRC, 0, "Polypaudio Sound Server", "polypsrc", FALSE,
+  {PIPE_TYPE_AUDIOSRC, 0, "Polypaudio Sound Server", "polypsrc", NULL, FALSE,
       TEST_PIPE_AUDIOSINK, NULL, FALSE},
   /* Note: using triangle instead of sine for test sound so we
    * can test the vorbis encoder as well (otherwise it'd compress too well) */
-  {PIPE_TYPE_AUDIOSRC, 0, "Test Sound", "audiotestsrc wave=triangle is-live=true", FALSE,
+  {PIPE_TYPE_AUDIOSRC, 0, "Test Sound", "audiotestsrc wave=triangle is-live=true", NULL, FALSE,
       TEST_PIPE_AUDIOSINK, NULL, FALSE},
-  {PIPE_TYPE_AUDIOSRC, 0, "Silence", "audiotestsrc wave=silence is-live=true", FALSE,
+  {PIPE_TYPE_AUDIOSRC, 0, "Silence", "audiotestsrc wave=silence is-live=true", NULL, FALSE,
       TEST_PIPE_AUDIOSINK, NULL, FALSE},
-  {PIPE_TYPE_AUDIOSRC, 0, N_("Custom"), NULL, TRUE, TEST_PIPE_AUDIOSINK, NULL,
+  {PIPE_TYPE_AUDIOSRC, 0, N_("Custom"), NULL, NULL, TRUE, TEST_PIPE_AUDIOSINK, NULL,
       TRUE}
 };
 
 GSTPPipelineDescription videosrc_pipelines[] = {
-  {PIPE_TYPE_VIDEOSRC, 0, "MJPEG (e.g. Zoran v4l device)", "v4lmjpegsrc", FALSE,
+  {PIPE_TYPE_VIDEOSRC, 0, "MJPEG (e.g. Zoran v4l device)", "v4lmjpegsrc", NULL, FALSE,
       TEST_PIPE_VIDEOSINK, NULL, FALSE},
-  {PIPE_TYPE_VIDEOSRC, 0, "QCAM", "qcamsrc", FALSE, TEST_PIPE_VIDEOSINK,
+  {PIPE_TYPE_VIDEOSRC, 0, "QCAM", "qcamsrc", NULL, FALSE, TEST_PIPE_VIDEOSINK,
       NULL, FALSE},
-  {PIPE_TYPE_VIDEOSRC, 0, "Test Input", "videotestsrc is-live=true", FALSE,
+  {PIPE_TYPE_VIDEOSRC, 0, "Test Input", "videotestsrc is-live=true", NULL, FALSE,
       TEST_PIPE_VIDEOSINK, NULL, FALSE},
-  {PIPE_TYPE_VIDEOSRC, 0, "Video for Linux (v4l)", "v4lsrc", FALSE,
+  {PIPE_TYPE_VIDEOSRC, 0, "Video for Linux (v4l)", "v4lsrc", NULL, FALSE,
       TEST_PIPE_VIDEOSINK, NULL, FALSE},
-  {PIPE_TYPE_VIDEOSRC, 0, "Video for Linux 2 (v4l2)", "v4l2src", FALSE,
+  {PIPE_TYPE_VIDEOSRC, 0, "Video for Linux 2 (v4l2)", "v4l2src", NULL, FALSE,
       TEST_PIPE_VIDEOSINK, NULL, FALSE},
-  {PIPE_TYPE_VIDEOSRC, 0, N_("Custom"), NULL, TRUE, TEST_PIPE_VIDEOSINK, NULL,
+  {PIPE_TYPE_VIDEOSRC, 0, N_("Custom"), NULL, NULL, TRUE, TEST_PIPE_VIDEOSINK, NULL,
       TRUE}
 };
 
@@ -154,33 +154,33 @@
         G_N_ELEMENTS (audiosink_pipelines),
         (GSTPPipelineDescription *) (audiosink_pipelines), 0,
         GSTPROPS_KEY_DEFAULT_AUDIOSINK,
-        "audiosink_optionmenu", "audiosink_pipeline_entry",
-        "audiosink_test_button",
-      NULL, NULL, NULL},
+        "audiosink_optionmenu", "audiosink_devicemenu",
+				"audiosink_pipeline_entry", "audiosink_test_button",
+      NULL, NULL, NULL, NULL},
   /* videosink pipelines */
   {
         G_N_ELEMENTS (videosink_pipelines),
         (GSTPPipelineDescription *) (videosink_pipelines), 0,
         GSTPROPS_KEY_DEFAULT_VIDEOSINK,
-        "videosink_optionmenu", "videosink_pipeline_entry",
-        "videosink_test_button",
-      NULL, NULL, NULL},
+        "videosink_optionmenu", "videosink_devicemenu",
+        "videosink_pipeline_entry", "videosink_test_button",
+      NULL, NULL, NULL, NULL},
   /* videosrc pipelines */
   {
         G_N_ELEMENTS (videosrc_pipelines),
         (GSTPPipelineDescription *) (videosrc_pipelines), 0,
         GSTPROPS_KEY_DEFAULT_VIDEOSRC,
-        "videosrc_optionmenu", "videosrc_pipeline_entry",
-        "videosrc_test_button",
-      NULL, NULL, NULL},
+        "videosrc_optionmenu", "videosrc_devicemenu",
+        "videosrc_pipeline_entry", "videosrc_test_button",
+      NULL, NULL, NULL, NULL},
   /* audiosrc pipelines */
   {
         G_N_ELEMENTS (audiosrc_pipelines),
         (GSTPPipelineDescription *) (audiosrc_pipelines), 0,
         GSTPROPS_KEY_DEFAULT_AUDIOSRC,
-        "audiosrc_optionmenu", "audiosrc_pipeline_entry",
-        "audiosrc_test_button",
-      NULL, NULL, NULL}
+        "audiosrc_optionmenu", "audiosrc_devicemenu",
+        "audiosrc_pipeline_entry", "audiosrc_test_button",
+      NULL, NULL, NULL, NULL}
 };
 
 gint pipeline_editors_count = G_N_ELEMENTS (pipeline_editors);
Index: gstreamer-properties/pipeline-tests.c
===================================================================
RCS file: /cvs/gnome/gnome-media/gstreamer-properties/pipeline-tests.c,v
retrieving revision 1.7
diff -u -r1.7 pipeline-tests.c
--- gstreamer-properties/pipeline-tests.c	20 Jan 2006 11:55:25 -0000	1.7
+++ gstreamer-properties/pipeline-tests.c	21 Jul 2006 00:53:58 -0000
@@ -59,6 +59,51 @@
   return TRUE;
 }
 
+gchar *
+gst_pipeline_string_from_desc (GSTPPipelineDescription * pipeline_desc)
+{
+	gchar *pipeline = NULL;
+  if (pipeline_desc->device != NULL && pipeline_desc->device != "") {
+	  pipeline = g_strdup_printf ("%s device=\"%s\"", pipeline_desc->pipeline,
+                                pipeline_desc->device);
+  }
+  else
+    pipeline = pipeline_desc->pipeline;
+
+  return pipeline;
+}
+
+gchar *
+gst_pipeline_string_get_property_value (const gchar *pipeline_str, const gchar *propertyname)
+{
+  gchar **pipeline_nodes = NULL;
+  gchar *node = NULL;
+  gchar *node_value = NULL;
+  gchar **node_split = NULL;
+  gint i = 0;
+
+  g_assert (pipeline_str != NULL);
+
+  pipeline_nodes = g_strsplit (pipeline_str, " ", -1);
+
+  while(node = pipeline_nodes[i++]) {
+    /* Split into key = value pair */
+    node_split = g_strsplit_set (node, "=", -1);
+    if (node_split != NULL && node_split[1] != NULL) {
+      if (!strcmp (node_split[0], propertyname)) {
+        node_value = g_shell_unquote(node_split[1], NULL);
+      }
+    }
+    g_strfreev (node_split);
+
+    if (node_value != NULL) break;
+  }
+
+  g_strfreev (pipeline_nodes);
+
+  return node_value;
+}
+
 /* Build the pipeline */
 static gboolean
 build_test_pipeline (GSTPPipelineDescription * pipeline_desc, GError ** p_err)
@@ -96,12 +141,12 @@
     case PIPE_TYPE_AUDIOSINK:
     case PIPE_TYPE_VIDEOSINK:
       full_pipeline_str = g_strdup_printf ("%s ! %s ! %s",
-          test_pipeline_str, in_between, pipeline_desc->pipeline);
+          test_pipeline_str, in_between, gst_pipeline_string_from_desc(pipeline_desc));
       break;
     case PIPE_TYPE_AUDIOSRC:
     case PIPE_TYPE_VIDEOSRC:
       full_pipeline_str = g_strdup_printf ("%s ! %s ! %s",
-          pipeline_desc->pipeline, in_between, test_pipeline_str);
+          gst_pipeline_string_from_desc(pipeline_desc), in_between, test_pipeline_str);
       break;
   }
 
Index: gstreamer-properties/pipeline-tests.h
===================================================================
RCS file: /cvs/gnome/gnome-media/gstreamer-properties/pipeline-tests.h,v
retrieving revision 1.2
diff -u -r1.2 pipeline-tests.h
--- gstreamer-properties/pipeline-tests.h	19 Jan 2006 23:52:22 -0000	1.2
+++ gstreamer-properties/pipeline-tests.h	21 Jul 2006 00:53:58 -0000
@@ -28,6 +28,9 @@
 #include <glade/glade.h>
 #include "gstreamer-properties-structs.h"
 
+gchar *gst_pipeline_string_from_desc (GSTPPipelineDescription *pipeline_desc);
+gchar *gst_pipeline_string_get_property_value (const gchar *pipeline_str, const gchar *propertyname);
+
 void user_test_pipeline(GladeXML *interface_xml,
 		    GtkWindow *parent,
 		    GSTPPipelineDescription *pipeline_desc);
