Index: doc/how-to-get-focus-right.txt
===================================================================
RCS file: /cvs/gnome/metacity/doc/how-to-get-focus-right.txt,v
retrieving revision 1.4
diff -p -u -r1.4 how-to-get-focus-right.txt
--- doc/how-to-get-focus-right.txt	9 Jan 2005 19:27:21 -0000	1.4
+++ doc/how-to-get-focus-right.txt	29 Jan 2005 20:54:22 -0000
@@ -37,6 +37,14 @@ Focus method  Behavior
     mouse     Focus the window containing the pointer if there is one,
               otherwise focus the designated "no_focus_window".
 
+Note that "most recently used window", as used here, has a slightly
+different connotation than "most recent to have keyboard focus".  This
+is because when a user activates a window that is a transient, its
+ancestor(s) should be considered to be more recently used than other
+windows that have had the keyboard focus more recently.  (See bug
+157360; this may mean that the alt-tab order should also change
+simultaneously, although the current implementation does not do that.)
+
 Also, sometimes a new window will be mapped (e.g. unminimizing a
 window or launching a new application).  Most users want to interact
 with new windows right away, so these should typically be focused.
Index: src/workspace.c
===================================================================
RCS file: /cvs/gnome/metacity/src/workspace.c,v
retrieving revision 1.68
diff -p -u -r1.68 workspace.c
--- src/workspace.c	23 Dec 2004 00:20:33 -0000	1.68
+++ src/workspace.c	29 Jan 2005 20:54:22 -0000
@@ -29,9 +29,9 @@
 
 void meta_workspace_queue_calc_showing      (MetaWorkspace *workspace);
 static void set_active_space_hint           (MetaScreen *screen);
-static void meta_workspace_focus_mru_window (MetaWorkspace *workspace,
-                                             MetaWindow    *not_this_one,
-                                             Time           timestamp);
+static void focus_ancestor_or_mru_window (MetaWorkspace *workspace,
+                                          MetaWindow    *not_this_one,
+                                          Time           timestamp);
 
 static void
 maybe_add_to_list (MetaScreen *screen, MetaWindow *window, gpointer data)
@@ -801,7 +801,7 @@ meta_workspace_focus_default_window (Met
 
 
   if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK)
-    meta_workspace_focus_mru_window (workspace, not_this_one, timestamp);
+    focus_ancestor_or_mru_window (workspace, not_this_one, timestamp);
   else
     {
       MetaWindow * window;
@@ -838,7 +838,7 @@ meta_workspace_focus_default_window (Met
             }
         }
       else if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_SLOPPY)
-        meta_workspace_focus_mru_window (workspace, not_this_one, timestamp);
+        focus_ancestor_or_mru_window (workspace, not_this_one, timestamp);
       else if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_MOUSE)
         {
           meta_topic (META_DEBUG_FOCUS,
@@ -850,11 +850,23 @@ meta_workspace_focus_default_window (Met
     }
 }
 
-/* Focus MRU window (or top window if failed) on active workspace */
+static gboolean
+record_ancestor (MetaWindow *window,
+                 void       *data)
+{
+  MetaWindow **result = data;
+
+  *result = window;
+  return FALSE; /* quit with the first ancestor we find */
+}
+
+/* Focus ancestor of not_this_one if there is one, otherwise focus the MRU
+ * window on active workspace
+ */
 void
-meta_workspace_focus_mru_window (MetaWorkspace *workspace,
-                                 MetaWindow    *not_this_one,
-                                 Time           timestamp)
+focus_ancestor_or_mru_window (MetaWorkspace *workspace,
+                              MetaWindow    *not_this_one,
+                              Time           timestamp)
 {
   MetaWindow *window = NULL;
   GList *tmp;
@@ -862,7 +874,33 @@ meta_workspace_focus_mru_window (MetaWor
   if (not_this_one)
     meta_topic (META_DEBUG_FOCUS,
                 "Focusing MRU window excluding %s\n", not_this_one->desc);
-  
+  else
+    meta_topic (META_DEBUG_FOCUS,
+                "Focusing MRU window\n");
+
+  /* First, check to see if we need to focus an ancestor of a window */  
+  if (not_this_one)
+    {
+      MetaWindow *ancestor;
+      ancestor = NULL;
+      meta_window_foreach_ancestor (not_this_one, record_ancestor, &ancestor);
+      if (ancestor != NULL)
+        {
+          meta_topic (META_DEBUG_FOCUS,
+                      "Focusing %s, ancestor of %s\n", 
+                      ancestor->desc, not_this_one->desc);
+      
+          meta_window_focus (ancestor, timestamp);
+
+          /* Also raise the window if in click-to-focus */
+          if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK)
+            meta_window_raise (ancestor);
+
+          return;
+        }
+    }
+
+  /* No ancestor, look for the MRU window */
   tmp = workspace->mru_list;  
 
   while (tmp)
