don't give focus to transient when it is ambiguous, but only if they have a parent
Dana Jansens danakj@orodu.net
2 files changed,
13 insertions(+),
1 deletions(-)
M
openbox/client.c
→
openbox/client.c
@@ -498,7 +498,7 @@ /* If its a transient (and parents aren't focused) and the time
is ambiguous (either the current focus target doesn't have a timestamp, or they are the same (we probably inherited it from them) */ - else if (self->transient_for != NULL && + else if (client_has_parent(self) && (!last_time || self->user_time == last_time)) { activate = FALSE;@@ -2372,6 +2372,13 @@ does not, so we need to check this window */
if (client_focused(self)) return self; return client_search_focus_tree(self); +} + +gboolean client_has_parent(ObClient *self) +{ + return (self->transient_for && + (self->transient_for != TRAN_GROUP || + self->group && self->group->members->next)); } static ObStackingLayer calc_layer(ObClient *self)
M
openbox/client.h
→
openbox/client.h
@@ -612,6 +612,11 @@ void client_get_type_and_transientness(ObClient *self);
const ObClientIcon *client_icon(ObClient *self, gint w, gint h); +/*! Return TRUE if the client is transient for some other window. Return + FALSE if it's not transient or there is no window for it to be + transient for */ +gboolean client_has_parent(ObClient *self); + /*! 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.