diff -aur rhythmbox-x/data/rhythmbox.schemas rhythmbox/data/rhythmbox.schemas
--- rhythmbox-x/data/rhythmbox.schemas	2006-10-27 22:59:20.000000000 +1000
+++ rhythmbox/data/rhythmbox.schemas	2006-10-27 18:37:26.000000000 +1000
@@ -1066,5 +1066,17 @@
 	<long>Number of the screen on which to display fullscreen visualization</long>
 	</locale>
       </schema>
+      <schema>
+	<key>/schemas/apps/rhythmbox/plugins/visualizer/monitor</key>
+	<applyto>/apps/rhythmbox/plugins/visualizer/monitor</applyto>
+	<owner>rhythmbox</owner>
+	<type>int</type>
+	<default>0</default>
+	<locale name="C">
+	<short>Number of the monitor on which to display fullmonitor visualization</short>
+	<long>Number of the monitor on which to display fullmonitor visualization</long>
+	</locale>
+      </schema>
+
     </schemalist>
 </gconfschemafile>
diff -aur rhythmbox-x/plugins/visualizer/Makefile.am rhythmbox/plugins/visualizer/Makefile.am
--- rhythmbox-x/plugins/visualizer/Makefile.am	2006-10-27 22:59:30.000000000 +1000
+++ rhythmbox/plugins/visualizer/Makefile.am	2006-10-27 18:01:10.000000000 +1000
@@ -56,13 +56,13 @@
 
 plugin_DATA = 			\
 	$(BUILT_SOURCES)	\
-	visualizer-ui.xml	\
-	visualizer-controls.glade \
 	$(NULL)
 
 EXTRA_DIST = 			\
 	$(glade_DATA)		\
 	$(plugin_in_files)	\
+	visualizer-ui.xml	\
+	visualizer-controls.glade \
 	$(NULL)
 
 CLEANFILES = 			\
diff -aur rhythmbox-x/plugins/visualizer/rb-visualizer-plugin.c rhythmbox/plugins/visualizer/rb-visualizer-plugin.c
--- rhythmbox-x/plugins/visualizer/rb-visualizer-plugin.c	2006-10-27 22:59:30.000000000 +1000
+++ rhythmbox/plugins/visualizer/rb-visualizer-plugin.c	2006-10-27 22:44:52.000000000 +1000
@@ -106,6 +106,7 @@
 #define CONF_VIS_ELEMENT CONF_VIS_PREFIX "/element"
 #define CONF_VIS_QUALITY CONF_VIS_PREFIX "/quality"
 #define CONF_VIS_SCREEN  CONF_VIS_PREFIX "/screen"
+#define CONF_VIS_MONITOR CONF_VIS_PREFIX "/monitor"
 
 /* defaults */
 #define DEFAULT_VIS_ELEMENT	"goom"
@@ -515,7 +516,7 @@
 }
 
 static void
-update_window (RBVisualizerPlugin *plugin, gboolean fullscreen, int screen)
+update_window (RBVisualizerPlugin *plugin, gboolean fullscreen, int screen, int monitor)
 {
 	/* remove the visualizer container from whatever it's currently sitting in */
 	if (plugin->vis_box == NULL) {
@@ -579,6 +580,15 @@
 		}
 
 		gtk_window_set_screen (GTK_WINDOW (plugin->vis_window), gdk_screen);
+	
+		if (monitor != -1) {
+			GdkRectangle rect;
+
+			gdk_screen_get_monitor_geometry (gdk_screen, monitor, &rect);
+			gtk_window_move (GTK_WINDOW (plugin->vis_window), rect.x, rect.y);
+			gtk_window_resize (GTK_WINDOW (plugin->vis_window), rect.width, rect.height);
+		}
+
 		gtk_container_add (GTK_CONTAINER (plugin->vis_window), plugin->vis_box);
 	} else {
 		gtk_box_pack_start (GTK_BOX (plugin->vis_shell), plugin->vis_box, TRUE, TRUE, 0);
@@ -906,10 +916,11 @@
 	rb_shell_add_widget (pi->shell, pi->vis_shell, RB_SHELL_UI_LOCATION_MAIN_NOTEBOOK);
 
 	pi->vis_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+	gtk_window_set_skip_taskbar_hint (GTK_WINDOW (pi->vis_window));
 	g_object_ref (pi->vis_window);
 
 	/* real output window */
-	update_window (pi, FALSE, -1);
+	update_window (pi, FALSE, -1, -1);
 
 	/* fake output window */
 	{
@@ -1065,11 +1076,12 @@
 		       GtkTreeIter *iter,
 		       gpointer whatever)
 {
-	int screen;
+	int screen, monitor;
 	char *t;
 
-	gtk_tree_model_get (model, iter, 0, &screen, -1);
-	t = g_strdup_printf ("%d", screen);
+	gtk_tree_model_get (model, iter, 0, &screen, 1, &monitor, -1);
+	t = g_strdup_printf ("%d.%d", screen, monitor);
+	rb_debug ("displaying %s (%p)", t, iter);
 	g_object_set (G_OBJECT (cell), "text", t, NULL);
 	g_free (t);
 }
@@ -1078,6 +1090,8 @@
 populate_combo_boxes (RBVisualizerPlugin *pi)
 {
 	int i;
+	int count, index;
+	int screen;
 	int active;
 	GList *l;
 	GtkListStore *model;
@@ -1140,35 +1154,58 @@
 
 	/* screen selection */
 	num_screens = gdk_display_get_n_screens (gdk_display_get_default ());
-	if (num_screens < 2) {
-		/* no point showing the screen selection combo box, or its label */
-		rb_debug ("not showing screen selection widgets as there is only one screen");
-		pi->screen_controls_shown = FALSE;
-	} else {
-		int screen;
 
-		rb_debug ("populating screen selection combo box with %d screens", num_screens);
-		renderer = gtk_cell_renderer_text_new ();
-		gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (pi->screen_combo), renderer, TRUE);
-		gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (pi->screen_combo),
-						    renderer,
-						    (GtkCellLayoutDataFunc) screen_list_cell_data,
-						    NULL, NULL);
 
-		model = gtk_list_store_new (1, G_TYPE_INT);
-		for (i = 0; i < num_screens; i++) {
+	rb_debug ("populating screen selection combo box with %d screens", num_screens);
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (pi->screen_combo), renderer, TRUE);
+	gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (pi->screen_combo),
+					    renderer,
+					    (GtkCellLayoutDataFunc) screen_list_cell_data,
+					    NULL, NULL);
+
+	screen = eel_gconf_get_integer (CONF_VIS_SCREEN);
+	if (screen < 0 || screen >= num_screens)
+		screen = 0;
+
+	model = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_INT);
+	count = 0;
+	index = 0;
+	for (i = 0; i < num_screens; i++) {
+		int num_monitors;
+		int monitor;
+		int j;
+
+		num_monitors = gdk_screen_get_n_monitors (gdk_display_get_screen (gdk_display_get_default (), i));
+		rb_debug ("populating screen selection combo box with %d monitors from screen %d", num_monitors, i);
+
+		for (j = 0; j < num_monitors; j++) {
 			GtkTreeIter iter;
 
 			gtk_list_store_append (model, &iter);
-			gtk_list_store_set (model, &iter, 0, i, -1);
+			gtk_list_store_set (model, &iter, 0, i, 1, j, -1);
+			rb_debug ("appending <%d,%d> to store", i, j);
+		}
+
+		if (i == screen) {
+			monitor = eel_gconf_get_integer (CONF_VIS_MONITOR);
+			if (monitor < 0 || monitor >= num_monitors)
+				monitor = 0;
+
+			index = count + monitor;
+			rb_debug ("current output is on %d.%d, id %d", screen, monitor, index);
 		}
-		gtk_combo_box_set_model (GTK_COMBO_BOX (pi->screen_combo), GTK_TREE_MODEL (model));
 
-		screen = eel_gconf_get_integer (CONF_VIS_SCREEN);
-		if (screen < 0 || screen >= num_screens)
-			screen = 0;
-		gtk_combo_box_set_active (GTK_COMBO_BOX (pi->screen_combo), screen);
+		count += num_monitors;
 	}
+
+	gtk_combo_box_set_model (GTK_COMBO_BOX (pi->screen_combo), GTK_TREE_MODEL (model));
+	gtk_combo_box_set_active (GTK_COMBO_BOX (pi->screen_combo), index);
+
+	if (num_screens > 1 || gdk_screen_get_n_monitors (gdk_display_get_screen (gdk_display_get_default (), 0)) > 1) {
+		pi->screen_controls_shown = TRUE;
+	}
+
 }
 
 static void
@@ -1215,33 +1252,41 @@
 static void
 screen_changed_cb (GtkComboBox *combo, RBVisualizerPlugin *pi)
 {
+	GtkTreeIter iter;
 	int screen;
-	int num_screens;
+	int monitor;
 
-	num_screens = gdk_display_get_n_screens (gdk_display_get_default ());
+	gtk_combo_box_get_active_iter (combo, &iter);
+	gtk_tree_model_get (gtk_combo_box_get_model (combo), &iter, 0, &screen, 1, &monitor, -1);
 
-	screen = gtk_combo_box_get_active (combo);
-	if (screen < 0 || screen >= num_screens) {
-		rb_debug ("unknown screen selected?");
+	if (screen < 0 || screen >= gdk_display_get_n_screens (gdk_display_get_default ())) {
+		rb_debug ("unknown screen %d selected?", screen);
 		screen = 0;
+		monitor = 0;
+	} else if (monitor < 0 || monitor >= gdk_screen_get_n_monitors (gdk_display_get_screen (gdk_display_get_default (), screen))) {
+		rb_debug ("unknown monitor %d (of screen %d) selected?", monitor, screen);
+		monitor = 0;
+	} else {
+		rb_debug ("selecting screen %d.%d", screen, monitor);
 	}
 
 	eel_gconf_set_integer (CONF_VIS_SCREEN, screen);
+	eel_gconf_set_integer (CONF_VIS_MONITOR, monitor);
 
-	update_window (pi, pi->fullscreen, screen);
+	update_window (pi, pi->fullscreen, screen, monitor);
 }
 
 static void
 fullscreen_clicked_cb (GtkButton *button, RBVisualizerPlugin *pi)
 {
-	update_window (pi, TRUE, eel_gconf_get_integer (CONF_VIS_SCREEN));
+	update_window (pi, TRUE, eel_gconf_get_integer (CONF_VIS_SCREEN), eel_gconf_get_integer (CONF_VIS_MONITOR));
 	enable_visualization (pi);
 }
 
 static void
 leave_fullscreen_clicked_cb (GtkButton *button, RBVisualizerPlugin *pi)
 {
-	update_window (pi, FALSE, -1);
+	update_window (pi, FALSE, -1, -1);
 	enable_visualization (pi);
 }
 
