all repos — openbox @ 365940477b77e6993412dfd7136172a4d4318ac1

openbox fork - make it a bit more like ryudo

add some more client tree searching functions. make transients always get focused when a parent has focus, not just direct parents.
Dana Jansens danakj@orodu.net
commit

365940477b77e6993412dfd7136172a4d4318ac1

parent

f370cbc858cd0e7f86e99684543c3656b93dd0fb

2 files changed, 57 insertions(+), 3 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -277,9 +277,7 @@ client_restore_session_stacking(self);

/* 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 */

@@ -2805,6 +2803,52 @@ }

} 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)
M openbox/client.hopenbox/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.

@@ -504,6 +510,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. */