add some more client tree searching functions. make transients always get focused when a parent has focus, not just direct parents.
This commit is contained in:
parent
f370cbc858
commit
365940477b
2 changed files with 57 additions and 3 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue