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;
|
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)
|
void client_calc_layer(Client *self)
|
||||||
{
|
{
|
||||||
StackLayer l;
|
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;
|
if (self->iconic) l = Layer_Icon;
|
||||||
/* fullscreen windows are only in the fullscreen layer while focused */
|
/* 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_Desktop) l = Layer_Desktop;
|
||||||
else if (self->type == Type_Dock) {
|
else if (self->type == Type_Dock) {
|
||||||
if (!self->below) l = Layer_Top;
|
if (!self->below) l = Layer_Top;
|
||||||
else l = Layer_Normal;
|
else l = Layer_Normal;
|
||||||
}
|
}
|
||||||
else if (self->above) l = Layer_Above;
|
else if (self->above) l = Layer_Above;
|
||||||
else if (self->below) l = Layer_Below;
|
else if (self->below) l = Layer_Below;
|
||||||
else l = Layer_Normal;
|
else l = Layer_Normal;
|
||||||
|
|
||||||
if (l != self->layer) {
|
calc_recursive(self, l, FALSE);
|
||||||
self->layer = l;
|
|
||||||
if (self->frame)
|
|
||||||
stacking_raise(self);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean client_should_show(Client *self)
|
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) return; /* already done */
|
||||||
|
|
||||||
self->fullscreen = fs;
|
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 (fs) {
|
||||||
if (savearea) {
|
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);
|
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 */
|
/* try focus us when we go into fullscreen mode */
|
||||||
client_focus(self);
|
client_focus(self);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue