summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/client.c50
-rw-r--r--openbox/client.h10
2 files changed, 57 insertions, 3 deletions
diff --git a/openbox/client.c b/openbox/client.c
index 28405c13..7b969289 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -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;
diff --git a/openbox/client.h b/openbox/client.h
index 3b3c78f7..0c523deb 100644
--- a/openbox/client.h
+++ b/openbox/client.h
@@ -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);