diff -ru metacity-2.16.3.orig/src/common.h metacity-2.16.3/src/common.h
--- metacity-2.16.3.orig/src/common.h	2006-09-13 18:32:32.000000000 +0200
+++ metacity-2.16.3/src/common.h	2007-03-11 16:05:36.000000000 +0100
@@ -254,4 +254,7 @@
   (ycoord) >= (rect).y &&                   \
   (ycoord) <  ((rect).y + (rect).height))
 
+#define META_XINERAMA_SELECTION_ALL -1
+#define META_XINERAMA_SELECTION_CURRENT -2
+
 #endif
diff -ru metacity-2.16.3.orig/src/place.c metacity-2.16.3/src/place.c
--- metacity-2.16.3.orig/src/place.c	2006-05-15 19:00:14.000000000 +0200
+++ metacity-2.16.3/src/place.c	2007-03-11 15:59:23.000000000 +0100
@@ -858,44 +858,47 @@
   x = xi->rect.x;
   y = xi->rect.y;
 
-  if (find_first_fit (window, fgeom, windows,
-                      xineramas_list, n_xineramas,
-                      x, y, &x, &y))
-    goto done_check_denied_focus;
-
-  /* This is a special-case origin-cascade so that windows that are
-   * too large to fit onto a workspace (and which will be
-   * automaximized later) will go onto an empty xinerama if one is
-   * available.
-   */
-  if (window->has_maximize_func && window->decorated &&
-      !window->fullscreen)
+  if (meta_prefs_get_xinerama_selection() == META_XINERAMA_SELECTION_ALL)
     {
-      if (window->frame)
-        {
-          x = fgeom->left_width;
-          y = fgeom->top_height;
-        }
-      else
-        {
-          x = 0;
-          y = 0;
-        }
-
-      for (i = 0; i < n_xineramas; i++)
-        {
-          MetaRectangle work_area;
-          
-          meta_window_get_work_area_for_xinerama (window, xineramas_list[i], &work_area);
-          
-          if (!rectangle_overlaps_some_window (&work_area, windows))
-            {
-              x += work_area.x;
-              y += work_area.y;
-              placed_on = i;
-              break;
-            }
-        }
+    if (find_first_fit (window, fgeom, windows,
+                        xineramas_list, n_xineramas,
+                        x, y, &x, &y))
+      goto done_check_denied_focus;
+  
+    /* This is a special-case origin-cascade so that windows that are
+    * too large to fit onto a workspace (and which will be
+    * automaximized later) will go onto an empty xinerama if one is
+    * available.
+    */
+    if (window->has_maximize_func && window->decorated &&
+        !window->fullscreen)
+      {
+        if (window->frame)
+          {
+            x = fgeom->left_width;
+            y = fgeom->top_height;
+          }
+        else
+          {
+            x = 0;
+            y = 0;
+          }
+  
+        for (i = 0; i < n_xineramas; i++)
+          {
+            MetaRectangle work_area;
+            
+            meta_window_get_work_area_for_xinerama (window, xineramas_list[i], &work_area);
+            
+            if (!rectangle_overlaps_some_window (&work_area, windows))
+              {
+                x += work_area.x;
+                y += work_area.y;
+                placed_on = i;
+                break;
+              }
+          }
+      }
     }
 
   /* if the window wasn't placed at the origin of an empty xinerama,
diff -ru metacity-2.16.3.orig/src/prefs.c metacity-2.16.3/src/prefs.c
--- metacity-2.16.3.orig/src/prefs.c	2006-08-21 21:06:25.000000000 +0200
+++ metacity-2.16.3/src/prefs.c	2007-03-11 16:05:36.000000000 +0100
@@ -74,6 +74,8 @@
 #define KEY_CURSOR_SIZE "/desktop/gnome/peripherals/mouse/cursor_size"
 #define KEY_COMPOSITING_MANAGER "/apps/metacity/general/compositing_manager"
 
+#define KEY_XINERAMA_SELECTION "/apps/metacity/general/xinerama_selection"
+
 #ifdef HAVE_GCONF
 static GConfClient *default_client = NULL;
 static GList *changes = NULL;
@@ -102,6 +104,7 @@
 static char *cursor_theme = NULL;
 static int   cursor_size = 24;
 static gboolean compositing_manager = FALSE;
+static int xinerama_selection = META_XINERAMA_SELECTION_ALL;
 
 static MetaVisualBellType visual_bell_type = META_VISUAL_BELL_FULLSCREEN_FLASH;
 static MetaButtonLayout button_layout = {
@@ -165,6 +168,8 @@
 static gboolean update_cursor_size        (int size);
 static gboolean update_compositing_manager (gboolean	value);
 
+static gboolean update_xinerama_selection  (const char *value);
+
 static void change_notify (GConfClient    *client,
                            guint           cnxn_id,
                            GConfEntry     *entry,
@@ -506,6 +511,14 @@
                                   &err);
   cleanup_error (&err);
   update_cursor_size (int_val);
+
+  str_val = gconf_client_get_string (default_client, KEY_XINERAMA_SELECTION,
+                                     &err);
+  cleanup_error (&err);
+  update_xinerama_selection (str_val);
+  g_free (str_val);  
+
+
 #else  /* HAVE_GCONF */
   /* Set defaults for some values that can't be set at initialization time of
    * the static globals.  In the case of the theme, note that there is code
@@ -1037,6 +1050,22 @@
       if (update_compositing_manager (b))
         queue_changed (META_PREF_COMPOSITING_MANAGER);
     }
+  else if (strcmp (key, KEY_XINERAMA_SELECTION) == 0)
+    {
+      const char *str;
+
+      if (value && value->type != GCONF_VALUE_STRING)
+        {
+          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
+                        KEY_XINERAMA_SELECTION);
+          goto out;
+        }
+      
+      str = value ? gconf_value_get_string (value) : NULL;
+
+      if (update_xinerama_selection (str))
+        queue_changed (META_PREF_XINERAMA_SELECTION);
+    }
   else
     {
       meta_topic (META_DEBUG_PREFS, "Key %s doesn't mean anything to Metacity\n",
@@ -1672,6 +1701,34 @@
 }
 #endif /* HAVE_GCONF */
 
+#ifdef HAVE_GCONF
+static gboolean
+update_xinerama_selection (const char *value)
+{
+  int old_xinerama_selection = xinerama_selection;
+  
+  if (value != NULL)
+    {
+      if (g_ascii_strcasecmp (value, "all") == 0)
+        xinerama_selection = META_XINERAMA_SELECTION_ALL;
+      else if (g_ascii_strcasecmp (value, "current") == 0)
+        xinerama_selection = META_XINERAMA_SELECTION_CURRENT;
+      else
+        meta_warning (_("GConf key '%s' is set to an invalid value\n"),
+                      KEY_FOCUS_NEW_WINDOWS);
+    }
+
+  return (old_xinerama_selection != xinerama_selection);
+}
+#endif /* HAVE_GCONF */
+
+int
+meta_prefs_get_xinerama_selection (void)
+{
+  return xinerama_selection;
+}
+
+
 #ifdef WITH_VERBOSE_MODE
 const char*
 meta_preference_to_string (MetaPreference pref)
@@ -1755,6 +1812,10 @@
 
     case META_PREF_COMPOSITING_MANAGER:
       return "COMPOSITING_MANAGER";
+
+    case META_PREF_XINERAMA_SELECTION:
+      return "XINERAMA_SELECTION";
+
     }
 
   return "(unknown)";
diff -ru metacity-2.16.3.orig/src/prefs.h metacity-2.16.3/src/prefs.h
--- metacity-2.16.3.orig/src/prefs.h	2006-08-21 21:06:25.000000000 +0200
+++ metacity-2.16.3/src/prefs.h	2007-03-11 13:50:07.000000000 +0100
@@ -54,7 +54,8 @@
   META_PREF_GNOME_ACCESSIBILITY,
   META_PREF_CURSOR_THEME,
   META_PREF_CURSOR_SIZE,
-  META_PREF_COMPOSITING_MANAGER
+  META_PREF_COMPOSITING_MANAGER,
+  META_PREF_XINERAMA_SELECTION
 } MetaPreference;
 
 typedef void (* MetaPrefsChangedFunc) (MetaPreference pref,
@@ -102,6 +103,7 @@
 const char* meta_prefs_get_cursor_theme      (void);
 int         meta_prefs_get_cursor_size       (void);
 gboolean    meta_prefs_get_compositing_manager (void);
+int         meta_prefs_get_xinerama_selection (void);
 
 /* Screen bindings */
 #define META_KEYBINDING_WORKSPACE_1              "switch_to_workspace_1"
