apply layers to all transients. only raise once on the highest window who's layer changed after applying layers to them all
This commit is contained in:
parent
4d06971322
commit
58ebc8f73c
1 changed files with 48 additions and 13 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue