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:
Dana Jansens 2003-09-26 07:08:07 +00:00
parent f370cbc858
commit 365940477b
2 changed files with 57 additions and 3 deletions

View file

@ -277,9 +277,7 @@ void client_manage(Window window)
/* focus the new window? */ /* focus the new window? */
if (ob_state() != OB_STATE_STARTING && if (ob_state() != OB_STATE_STARTING &&
(config_focus_new || (self->transient_for && (config_focus_new || client_search_focus_parent(self)) &&
self->transient_for != OB_TRAN_GROUP &&
client_focused(self->transient_for))) &&
/* note the check against Type_Normal/Dialog, not client_normal(self), /* note the check against Type_Normal/Dialog, not client_normal(self),
which would also include other types. in this case we want more which would also include other types. in this case we want more
strict rules for focus */ strict rules for focus */
@ -2807,6 +2805,52 @@ ObClient *client_search_top_transient(ObClient *self)
return 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) ObClient *client_search_transient(ObClient *self, ObClient *search)
{ {
GSList *sit; GSList *sit;

View file

@ -485,6 +485,12 @@ void client_get_type(ObClient *self);
ObClientIcon *client_icon(ObClient *self, int w, int h); 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 /*! Searches a client's transients for a focused window. The function does not
check for the passed client, only for its transients. check for the passed client, only for its transients.
If no focused transient is found, NULL is returned. 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); 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, /*! 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. */ NULL is returned if the given search is not a transient of the client. */
ObClient *client_search_transient(ObClient *self, ObClient *search); ObClient *client_search_transient(ObClient *self, ObClient *search);