]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
fix a comment
[chaz/openbox] / openbox / client.c
index 477575a8cf9817717e33bd8ca395d5103c35a5f6..a80159786b8ca9c9f957e2b04dd28e9cedf3ad54 100644 (file)
@@ -441,7 +441,6 @@ void client_manage(Window window)
 
     /* do this after the window is placed, so the premax/prefullscreen numbers
        won't be all wacko!!
-       also, this moves the window to the position where it has been placed
     */
     client_apply_startup_state(self);
 
@@ -498,7 +497,7 @@ void client_manage(Window window)
                is ambiguous (either the current focus target doesn't have
                a timestamp, or they are the same (we probably inherited it
                from them) */
-            else if (self->transient_for != NULL &&
+            else if (client_has_parent(self) &&
                      (!last_time || self->user_time == last_time))
             {
                 activate = FALSE;
@@ -2355,27 +2354,44 @@ ObClient *client_search_focus_tree_full(ObClient *self)
             return client_search_focus_tree_full(self->transient_for);
         } else {
             GSList *it;
-            gboolean recursed = FALSE;
         
-            for (it = self->group->members; it; it = g_slist_next(it))
-                if (!((ObClient*)it->data)->transient_for) {
-                    ObClient *c;
-                    if ((c = client_search_focus_tree_full(it->data)))
-                        return c;
-                    recursed = TRUE;
+            for (it = self->group->members; it; it = g_slist_next(it)) {
+                if (it->data != self) {
+                    ObClient *c = it->data;
+
+                    if (client_focused(c)) return c;
+                    if ((c = client_search_focus_tree(it->data))) return c;
                 }
-            if (recursed)
-                return NULL;
+            }
         }
     }
 
-    /* this function checks the whole tree, the client_search_focus_tree~
+    /* this function checks the whole tree, the client_search_focus_tree
        does not, so we need to check this window */
     if (client_focused(self))
         return self;
     return client_search_focus_tree(self);
 }
 
+gboolean client_has_parent(ObClient *self)
+{
+    if (self->transient_for) {
+        if (self->transient_for != OB_TRAN_GROUP) {
+            if (client_normal(self->transient_for))
+                return TRUE;
+        }
+        else if (self->group) {
+            GSList *it;
+
+            for (it = self->group->members; it; it = g_slist_next(it)) {
+                if (it->data != self && client_normal(it->data))
+                    return TRUE;
+            }
+        }
+    }
+    return FALSE;
+}
+
 static ObStackingLayer calc_layer(ObClient *self)
 {
     ObStackingLayer l;
@@ -3463,6 +3479,8 @@ gboolean client_can_focus(ObClient *self)
 
 gboolean client_focus(ObClient *self)
 {
+    /* we might not focus this window, so if we have modal children which would
+       be focused instead, bring them to this desktop */
     client_bring_modal_windows(self);
 
     /* choose the correct target */
This page took 0.025222 seconds and 4 git commands to generate.