X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=4fa62190bde6362cd9edeb8c680527da5d5b0339;hb=9ed3baf9dbf0c4c1dcf4b63262eca03247b50a0d;hp=28405c131297a7d6c3663e3faa10395e81fea043;hpb=7dc01bbee786b2c64b35f87d9f03c5f6a4b9c8bc;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 28405c13..4fa62190 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 */ @@ -2183,7 +2181,7 @@ void client_maximize(ObClient *self, gboolean max, int dir, gboolean savearea) } } if ((dir == 0 || dir == 2) && self->max_vert) { /* vert */ - if (self->pre_max_area.width > 0) { + if (self->pre_max_area.height > 0) { y = self->pre_max_area.y; h = self->pre_max_area.height; @@ -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;