From 58ebc8f73cea0fc74d01cb0336dbb41d88cd5938 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 14 Apr 2003 01:10:54 +0000 Subject: [PATCH] apply layers to all transients. only raise once on the highest window who's layer changed after applying layers to them all --- openbox/client.c | 61 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 3244b507..7f59d99d 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -1300,27 +1300,64 @@ static Client *search_focus_tree(Client *node, Client *skip) return NULL; } +static void calc_recursive(Client *self, StackLayer l, gboolean raised) +{ + StackLayer old; + GSList *it; + + old = self->layer; + self->layer = l; + + for (it = self->transients; it; it = it->next) + calc_recursive(it->data, l, raised ? raised : l != old); + + if (!raised && l != old) + if (self->frame) + stacking_raise(self); +} + void client_calc_layer(Client *self) { StackLayer l; + gboolean f; + + /* transients take on the layer of their parents */ + if (self->transient_for) { + if (self->transient_for != TRAN_GROUP) { + self = self->transient_for; + } else { + GSList *it; + + for (it = self->group->members; it; it = it->next) + if (it->data != self && + ((Client*)it->data)->transient_for != TRAN_GROUP) { + self = self->transient_for; + break; + } + } + } + + /* is us or one of our transients focused? */ + if (client_focused(self)) + f = TRUE; + else if (search_focus_tree(self, self)) + f = TRUE; + else + f = FALSE; if (self->iconic) l = Layer_Icon; /* fullscreen windows are only in the fullscreen layer while focused */ - else if (self->fullscreen && focus_client == self) l = Layer_Fullscreen; + else if (self->fullscreen && f) l = Layer_Fullscreen; else if (self->type == Type_Desktop) l = Layer_Desktop; else if (self->type == Type_Dock) { - if (!self->below) l = Layer_Top; - else l = Layer_Normal; + if (!self->below) l = Layer_Top; + else l = Layer_Normal; } else if (self->above) l = Layer_Above; else if (self->below) l = Layer_Below; else l = Layer_Normal; - - if (l != self->layer) { - self->layer = l; - if (self->frame) - stacking_raise(self); - } + + calc_recursive(self, l, FALSE); } gboolean client_should_show(Client *self) @@ -1547,7 +1584,8 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea) self->fullscreen == fs) return; /* already done */ self->fullscreen = fs; - client_change_state(self); /* change the state hints on the client */ + client_change_state(self); /* change the state hints on the client, + and adjust out layer/stacking */ if (fs) { if (savearea) { @@ -1589,9 +1627,6 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea) client_configure(self, Corner_TopLeft, x, y, w, h, TRUE, TRUE); - /* raise (back) into our stacking layer */ - stacking_raise(self); - /* try focus us when we go into fullscreen mode */ client_focus(self); } -- 2.45.2