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:
Dana Jansens 2003-04-14 01:10:54 +00:00
parent 4d06971322
commit 58ebc8f73c

View file

@ -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);
} }