]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
when a window pops up a child, don't avoid focusing it because you were working in...
[chaz/openbox] / openbox / client.c
index 82976f6a4cf11ddc8e7f8585813e5eb858c04d00..f55af2b8a67ee31431bad8d01fac05b744c21f83 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;
This page took 0.020945 seconds and 4 git commands to generate.