diff -urN metacity-2.10.3/src/place.c metacity-2.10.3.patched/src/place.c
--- metacity-2.10.3/src/place.c	2005-07-20 23:06:19.000000000 -0500
+++ metacity-2.10.3.patched/src/place.c	2005-08-20 16:37:25.546106808 -0500
@@ -83,153 +83,31 @@
   else
     return 0;
 }
-     
+
 static void
-find_next_cascade (MetaWindow *window,
-                   MetaFrameGeometry *fgeom,
-                   /* visible windows on relevant workspaces */
-                   GList      *windows,
-                   int         x,
-                   int         y,
-                   int        *new_x,
-                   int        *new_y)
+center_on_current_xinerama (MetaWindow        *window,
+                            MetaFrameGeometry *fgeom,
+                            int               *new_x,
+                            int               *new_y)
 {
-  GList *tmp;
-  GList *sorted;
-  int cascade_x, cascade_y;
-  int x_threshold, y_threshold;
   int window_width, window_height;
-  int cascade_stage;
   MetaRectangle work_area;
   const MetaXineramaScreenInfo* current;
-  
-  sorted = g_list_copy (windows);
-  sorted = g_list_sort (sorted, northwestcmp);
-
-  /* This is a "fuzzy" cascade algorithm. 
-   * For each window in the list, we find where we'd cascade a
-   * new window after it. If a window is already nearly at that
-   * position, we move on.
-   */
-  
-  /* arbitrary-ish threshold, honors user attempts to
-   * manually cascade.
-   */
-#define CASCADE_FUZZ 15
-  if (fgeom)
-    {
-      x_threshold = MAX (fgeom->left_width, CASCADE_FUZZ);
-      y_threshold = MAX (fgeom->top_height, CASCADE_FUZZ);
-    }
-  else
-    {
-      x_threshold = CASCADE_FUZZ;
-      y_threshold = CASCADE_FUZZ;
-    }
-  
-  /* Find furthest-SE origin of all workspaces.
-   * cascade_x, cascade_y are the target position
-   * of NW corner of window frame.
-   */
 
   current = meta_screen_get_current_xinerama (window->screen);
   meta_window_get_work_area_for_xinerama (window, current->number, &work_area);
 
-  cascade_x = MAX (0, work_area.x);
-  cascade_y = MAX (0, work_area.y);
-  
-  /* Find first cascade position that's not used. */
-  
-  window_width = window->frame ? window->frame->rect.width : window->rect.width;
-  window_height = window->frame ? window->frame->rect.height : window->rect.height;
-  
-  cascade_stage = 0;
-  tmp = sorted;
-  while (tmp != NULL)
-    {
-      MetaWindow *w;
-      int wx, wy;
-      
-      w = tmp->data;
+  window_width = window->rect.width;
+  window_height = window->rect.height;
 
-      /* we want frame position, not window position */
-      if (w->frame)
-        {
-          wx = w->frame->rect.x;
-          wy = w->frame->rect.y;
-        }
-      else
-        {
-          wx = w->rect.x;
-          wy = w->rect.y;
-        }
-      
-      if (ABS (wx - cascade_x) < x_threshold &&
-          ABS (wy - cascade_y) < y_threshold)
-        {
-          /* This window is "in the way", move to next cascade
-           * point. The new window frame should go at the origin
-           * of the client window we're stacking above.
-           */
-          meta_window_get_position (w, &wx, &wy);
-          cascade_x = wx;
-          cascade_y = wy;
-          
-          /* If we go off the screen, start over with a new cascade */
-	  if (((cascade_x + window_width) >
-               (work_area.x + work_area.width)) ||
-              ((cascade_y + window_height) >
-	       (work_area.y + work_area.height)))
-	    {
-	      cascade_x = MAX (0, work_area.x);
-	      cascade_y = MAX (0, work_area.y);
-              
-#define CASCADE_INTERVAL 50 /* space between top-left corners of cascades */
-              cascade_stage += 1;
-	      cascade_x += CASCADE_INTERVAL * cascade_stage;
-              
-	      /* start over with a new cascade translated to the right, unless
-               * we are out of space
-               */
-              if ((cascade_x + window_width) <
-                  (work_area.x + work_area.width))
-                {
-                  tmp = sorted;
-                  continue;
-                }
-              else
-                {
-                  /* All out of space, this cascade_x won't work */
-                  cascade_x = MAX (0, work_area.x);
-                  break;
-                }
-	    }
-        }
-      else
-        {
-          /* Keep searching for a further-down-the-diagonal window. */
-        }
-        
-      tmp = tmp->next;
-    }
-
-  /* cascade_x and cascade_y will match the last window in the list
-   * that was "in the way" (in the approximate cascade diagonal)
-   */
-  
-  g_list_free (sorted);
-
-  /* Convert coords to position of window, not position of frame. */
-  if (fgeom == NULL)
-    {
-      *new_x = cascade_x;
-      *new_y = cascade_y;
-    }
-  else
+  if (fgeom)
     {
-      *new_x = cascade_x + fgeom->left_width;
-      *new_y = cascade_y + fgeom->top_height;
+      window_width += fgeom->left_width + fgeom->right_width;
+      window_height += fgeom->top_height + fgeom->bottom_height;
     }
+
+  *new_x = work_area.x + ((work_area.width - window_width) / 2);
+  *new_y = work_area.y + ((work_area.height - window_height) / 2);
 }
 
 static void
@@ -894,11 +772,11 @@
     }
 
   /* if the window wasn't placed at the origin of an empty xinerama,
-   * cascade it onto the current xinerama
+   * center it on the current xinerama
    */
   if (placed_on == -1)
     {
-      find_next_cascade (window, fgeom, windows, x, y, &x, &y);
+      center_on_current_xinerama (window, fgeom, &x, &y);
       placed_on = window->screen->last_xinerama_index;
     }
 
