when a window pops up a child, don't avoid focusing it because you were working in...
authorDana Jansens <danakj@orodu.net>
Thu, 6 Mar 2008 07:35:26 +0000 (02:35 -0500)
committerDana Jansens <danakj@orodu.net>
Thu, 6 Mar 2008 07:35:26 +0000 (02:35 -0500)
openbox/client.c
openbox/client.h

index 82976f6..f55af2b 100644 (file)
@@ -495,7 +495,10 @@ void client_manage(Window window, ObPrompt *prompt)
     if (activate) {
         gboolean raise = FALSE;
         gboolean relative_focused = FALSE;
+        gboolean parent_focused = FALSE;
 
+        parent_focused = (focus_client != NULL &&
+                          client_search_focus_parent(self));
         relative_focused = (focus_client != NULL &&
                             client_search_focus_tree_full(self) != NULL &&
                             client_search_focus_group_full(self) != NULL);
@@ -534,7 +537,8 @@ void client_manage(Window window, ObPrompt *prompt)
         else if (focus_client) {
             /* If the user is working in another window right now, then don't
                steal focus */
-            if (event_last_user_time && launch_time &&
+            if (!parent_focused &&
+                event_last_user_time && launch_time &&
                 event_time_after(event_last_user_time, launch_time) &&
                 event_last_user_time != launch_time &&
                 event_time_after(event_last_user_time,
@@ -543,7 +547,8 @@ void client_manage(Window window, ObPrompt *prompt)
                 activate = FALSE;
                 ob_debug_type(OB_DEBUG_FOCUS,
                               "Not focusing the window because the user is "
-                              "working in another window\n");
+                              "working in another window that is not "
+                              "its parent\n");
             }
             /* If the new window is a transient (and its relatives aren't
                focused) */
@@ -4049,6 +4054,21 @@ ObClient *client_search_focus_parent(ObClient *self)
     return NULL;
 }
 
+ObClient *client_search_focus_parent_full(ObClient *self)
+{
+    GSList *it;
+    ObClient *ret = NULL;
+
+    for (it = self->parents; it; it = g_slist_next(it)) {
+        if (client_focused(it->data))
+            ret = it->data;
+        else
+            ret = client_search_focus_parent_full(it->data);
+        if (ret) break;
+    }
+    return ret;
+}
+
 ObClient *client_search_parent(ObClient *self, ObClient *search)
 {
     GSList *it;
index c2461cb..a3d50b0 100644 (file)
@@ -643,12 +643,18 @@ RrImage* client_icon(ObClient *self);
   transient for */
 gboolean client_has_parent(ObClient *self);
 
-/*! Searches a client's direct parents for a focused window. The function does
-  not check for the passed client, only for *ONE LEVEL* of its parents.
-  If no focused parentt is found, NULL is returned.
+/*! Searches a client's immediate parents for a focused window. The function
+  does not check for the passed client, only for *ONE LEVEL* of its parents.
+  If no focused parent is found, NULL is returned.
 */
 ObClient *client_search_focus_parent(ObClient *self);
 
+/*! Searches a client's parents for a focused window. The function
+  does not check for the passed client, but searches through all of its
+  parents. If no focused parent is found, NULL is returned.
+*/
+ObClient *client_search_focus_parent_full(ObClient *self);
+
 /*! Searches a client's transients for a focused window. The function does not
   check for the passed client, only for its transients.
   If no focused transient is found, NULL is returned.