add some more client tree searching functions. make transients always get focused...
authorDana Jansens <danakj@orodu.net>
Fri, 26 Sep 2003 07:08:07 +0000 (07:08 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 26 Sep 2003 07:08:07 +0000 (07:08 +0000)
openbox/client.c
openbox/client.h

index 28405c1..7b96928 100644 (file)
@@ -277,9 +277,7 @@ void client_manage(Window window)
 
     /* focus the new window? */
     if (ob_state() != OB_STATE_STARTING &&
-        (config_focus_new || (self->transient_for &&
-                              self->transient_for != OB_TRAN_GROUP &&
-                              client_focused(self->transient_for))) &&
+        (config_focus_new || client_search_focus_parent(self)) &&
         /* note the check against Type_Normal/Dialog, not client_normal(self),
            which would also include other types. in this case we want more
            strict rules for focus */
@@ -2807,6 +2805,52 @@ ObClient *client_search_top_transient(ObClient *self)
     return self;
 }
 
+ObClient *client_search_focus_parent(ObClient *self)
+{
+    if (self->transient_for) {
+        if (self->transient_for != OB_TRAN_GROUP) {
+            if (client_focused(self->transient_for))
+                return self->transient_for;
+        } else {
+            GSList *it;
+
+            for (it = self->group->members; it; it = it->next) {
+                ObClient *c = it->data;
+
+                /* checking transient_for prevents infinate loops! */
+                if (c != self && !c->transient_for)
+                    if (client_focused(c))
+                        return c;
+            }
+        }
+    }
+
+    return NULL;
+}
+
+ObClient *client_search_parent(ObClient *self, ObClient *search)
+{
+    if (self->transient_for) {
+        if (self->transient_for != OB_TRAN_GROUP) {
+            if (self->transient_for == search)
+                return search;
+        } else {
+            GSList *it;
+
+            for (it = self->group->members; it; it = it->next) {
+                ObClient *c = it->data;
+
+                /* checking transient_for prevents infinate loops! */
+                if (c != self && !c->transient_for)
+                    if (c == search)
+                        return search;
+            }
+        }
+    }
+
+    return NULL;
+}
+
 ObClient *client_search_transient(ObClient *self, ObClient *search)
 {
     GSList *sit;
index 3b3c78f..0c523de 100644 (file)
@@ -485,6 +485,12 @@ void client_get_type(ObClient *self);
 
 ObClientIcon *client_icon(ObClient *self, int w, int h);
 
+/*! 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.
+*/
+ObClient *client_search_focus_parent(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.
@@ -505,6 +511,10 @@ ObClient *client_search_modal_child(ObClient *self);
 
 ObClient *client_search_top_transient(ObClient *self);
 
+/*! Search for a parent of a client. This only searches up *ONE LEVEL*, and
+  returns the searched for parent if it is a parent, or NULL if not. */
+ObClient *client_search_parent(ObClient *self, ObClient *search);
+
 /*! Search for a transient of a client. The transient is returned if it is one,
   NULL is returned if the given search is not a transient of the client. */
 ObClient *client_search_transient(ObClient *self, ObClient *search);