dispatch_client(Event_Client_Mapped, self, 0, 0);
/* focus the new window? */
- if (ob_state != State_Starting) {
+ if (ob_state != State_Starting && client_normal(self)) {
if (config_focus_new)
client_focus(self);
else if (self->transient_for) {
if (!(self->decorations & Decor_Titlebar))
self->functions &= ~Func_Shade;
+ /* now we need to check against rules for the client's current state */
+ if (self->fullscreen) {
+ self->functions &= (Func_Close | Func_Fullscreen | Func_Iconify);
+ self->decorations = 0;
+ }
+
client_change_allowed_actions(self);
if (self->frame) {
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 fs;
- Client *c;
-
- /* are we fullscreen, or do we have a fullscreen transient parent? */
- c = self;
- fs = FALSE;
- while (c && c != TRAN_GROUP) { /* XXX do smthng with the TRAN_GROUP case?*/
- if (c->fullscreen) {
- fs = TRUE;
- break;
- }
- c = c->transient_for;
- }
- if (!fs && self->fullscreen) {
- /* is one of our transients focused? */
- c = search_focus_tree(self, self);
- if (c != NULL) fs = TRUE;
+ 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;
- else if (fs) l = Layer_Fullscreen;
+ /* fullscreen windows are only in the fullscreen layer while focused */
+ 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)
y = 0;
w = screen_physical_size.width;
h = screen_physical_size.height;
+ user = FALSE; /* ignore that increment etc shit when in fullscreen */
} else {
/* set the size and position if maximized */
if (self->max_horz) {
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) {
- /* save the functions and remove them */
- self->pre_fs_func = self->functions;
- self->functions &= (Func_Close | Func_Fullscreen |
- Func_Iconify);
- /* save the decorations and remove them */
- self->pre_fs_decor = self->decorations;
- self->decorations = 0;
if (savearea) {
long dimensions[4];
dimensions[0] = self->area.x;
} else {
long *dimensions;
- self->functions = self->pre_fs_func;
- self->decorations = self->pre_fs_decor;
-
if (PROP_GET32A(self->window, openbox_premax, cardinal,
dimensions, 4)) {
x = dimensions[0];
}
}
- client_change_allowed_actions(self); /* based on the new _functions */
-
- /* when fullscreening, don't obey things like increments, fill the
- screen */
- client_configure(self, Corner_TopLeft, x, y, w, h, !fs, TRUE);
+ client_setup_decor_and_functions(self);
- /* raise (back) into our stacking layer */
- stacking_raise(self);
+ client_configure(self, Corner_TopLeft, x, y, w, h, TRUE, TRUE);
/* try focus us when we go into fullscreen mode */
client_focus(self);
void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
{
+ GSList *it;
+
/* move up the transient chain as far as possible first if deiconifying */
if (!iconic)
while (self->transient_for) {
Client *c = it->data;
if (c != self && c->transient_for->iconic != iconic &&
- (c->transient_for != TRAN_GROUP ||
- c->group != self->group)) {
+ c->transient_for != TRAN_GROUP) {
self = it->data;
break;
}
self, 0, 0);
/* iconify all transients */
- if (self->transients) {
- GSList *it;
-
- for (it = self->transients; it != NULL; it = it->next)
- if (it->data != self) client_iconify(it->data, iconic, curdesk);
- }
+ for (it = self->transients; it != NULL; it = it->next)
+ if (it->data != self) client_iconify(it->data, iconic, curdesk);
}
void client_maximize(Client *self, gboolean max, int dir, gboolean savearea)
void client_unfocus(Client *self)
{
g_assert(focus_client == self);
+#ifdef DEBUG_FOCUS
g_message("client_unfocus");
+#endif
focus_fallback(Fallback_Unfocusing);
}