]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
apply layers to all transients. only raise once on the highest window who's layer...
[chaz/openbox] / openbox / client.c
index f4dd727b9dc33490d660d29f8b928b70ce349b23..7f59d99d2657cf3b16ec95a2d2e4e33422930d4a 100644 (file)
@@ -238,7 +238,7 @@ void client_manage(Window window)
     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) {
@@ -927,6 +927,12 @@ void client_setup_decor_and_functions(Client *self)
     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) {
@@ -1294,44 +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 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)
@@ -1413,6 +1439,7 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h,
        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) {
@@ -1557,16 +1584,10 @@ 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) {
-       /* 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;
@@ -1584,9 +1605,6 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea)
     } 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];
@@ -1605,14 +1623,9 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea)
        }
     }
 
-    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);
@@ -1620,6 +1633,8 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea)
 
 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) {
@@ -1637,8 +1652,7 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
                     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;
                     }
@@ -1674,12 +1688,8 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
                     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)
@@ -2124,7 +2134,9 @@ gboolean client_focus(Client *self)
 void client_unfocus(Client *self)
 {
     g_assert(focus_client == self);
+#ifdef DEBUG_FOCUS
     g_message("client_unfocus");
+#endif
     focus_fallback(Fallback_Unfocusing);
 }
 
This page took 0.029489 seconds and 4 git commands to generate.