]> git.lizzy.rs Git - bspwm.git/blobdiff - stack.c
Fix typo
[bspwm.git] / stack.c
diff --git a/stack.c b/stack.c
index 0f554f57c0ad5a804ff28378301579166c1942b3..c1cbb95b940102eb9bfe3ee019e433b322b32250 100644 (file)
--- a/stack.c
+++ b/stack.c
@@ -25,6 +25,9 @@
 #include <stdlib.h>
 #include "bspwm.h"
 #include "window.h"
+#include "subscribe.h"
+#include "ewmh.h"
+#include "tree.h"
 #include "stack.h"
 
 stacking_list_t *make_stack(node_t *n)
@@ -41,17 +44,21 @@ void stack_insert_after(stacking_list_t *a, node_t *n)
        if (a == NULL) {
                stack_head = stack_tail = s;
        } else {
-               if (a->node == n)
+               if (a->node == n) {
+                       free(s);
                        return;
+               }
                remove_stack_node(n);
                stacking_list_t *b = a->next;
-               if (b != NULL)
+               if (b != NULL) {
                        b->prev = s;
+               }
                s->next = b;
                s->prev = a;
                a->next = s;
-               if (stack_tail == a)
+               if (stack_tail == a) {
                        stack_tail = s;
+               }
        }
 }
 
@@ -61,43 +68,54 @@ void stack_insert_before(stacking_list_t *a, node_t *n)
        if (a == NULL) {
                stack_head = stack_tail = s;
        } else {
-               if (a->node == n)
+               if (a->node == n) {
+                       free(s);
                        return;
+               }
                remove_stack_node(n);
                stacking_list_t *b = a->prev;
-               if (b != NULL)
+               if (b != NULL) {
                        b->next = s;
+               }
                s->prev = b;
                s->next = a;
                a->prev = s;
-               if (stack_head == a)
+               if (stack_head == a) {
                        stack_head = s;
+               }
        }
 }
 
 void remove_stack(stacking_list_t *s)
 {
-       if (s == NULL)
+       if (s == NULL) {
                return;
+       }
        stacking_list_t *a = s->prev;
        stacking_list_t *b = s->next;
-       if (a != NULL)
+       if (a != NULL) {
                a->next = b;
-       if (b != NULL)
+       }
+       if (b != NULL) {
                b->prev = a;
-       if (s == stack_head)
+       }
+       if (s == stack_head) {
                stack_head = b;
-       if (s == stack_tail)
+       }
+       if (s == stack_tail) {
                stack_tail = a;
+       }
        free(s);
 }
 
 void remove_stack_node(node_t *n)
 {
-       for (stacking_list_t *s = stack_head; s != NULL; s = s->next) {
-               if (s->node == n) {
-                       remove_stack(s);
-                       return;
+       for (node_t *f = first_extrema(n); f != NULL; f = next_leaf(f, n)) {
+               for (stacking_list_t *s = stack_head; s != NULL; s = s->next) {
+                       if (s->node == f) {
+                               remove_stack(s);
+                               break;
+                       }
                }
        }
 }
@@ -144,26 +162,57 @@ stacking_list_t *limit_below(node_t *n)
        return s;
 }
 
-void stack(node_t *n, bool focused)
+void stack(desktop_t *d, node_t *n, bool focused)
 {
-       if (IS_FLOATING(n->client) && !auto_raise) {
-               return;
+       for (node_t *f = first_extrema(n); f != NULL; f = next_leaf(f, n)) {
+               if (f->client == NULL || (IS_FLOATING(f->client) && !auto_raise)) {
+                       continue;
+               }
+
+               if (stack_head == NULL) {
+                       stack_insert_after(NULL, f);
+               } else {
+                       stacking_list_t *s = (focused ? limit_above(f) : limit_below(f));
+                       if (s == NULL) {
+                               continue;
+                       }
+                       int i = stack_cmp(f->client, s->node->client);
+                       if (i < 0 || (i == 0 && !focused)) {
+                               stack_insert_before(s, f);
+                               window_below(f->id, s->node->id);
+                               put_status(SBSC_MASK_NODE_STACK, "node_stack 0x%08X below 0x%08X\n", f->id, s->node->id);
+                       } else {
+                               stack_insert_after(s, f);
+                               window_above(f->id, s->node->id);
+                               put_status(SBSC_MASK_NODE_STACK, "node_stack 0x%08X above 0x%08X\n", f->id, s->node->id);
+                       }
+               }
+       }
+
+       ewmh_update_client_list(true);
+       restack_presel_feedback(d);
+}
+
+void restack_presel_feedback(desktop_t *d)
+{
+       stacking_list_t *s = stack_tail;
+       while (s != NULL && !IS_TILED(s->node->client)) {
+               s = s->prev;
+       }
+       if (s != NULL) {
+               restack_presel_feedback_in(d->root, s->node);
        }
+}
 
-       if (stack_head == NULL) {
-               stack_insert_after(NULL, n);
+void restack_presel_feedback_in(node_t *r, node_t *n)
+{
+       if (r == NULL) {
+               return;
        } else {
-               stacking_list_t *s = (focused ? limit_above(n) : limit_below(n));
-               if (s == NULL) {
-                       return;
-               }
-               int i = stack_cmp(n->client, s->node->client);
-               if (i < 0 || (i == 0 && !focused)) {
-                       stack_insert_before(s, n);
-                       window_below(n->client->window, s->node->client->window);
-               } else {
-                       stack_insert_after(s, n);
-                       window_above(n->client->window, s->node->client->window);
+               if (r->presel != NULL) {
+                       window_above(r->presel->feedback, n->id);
                }
+               restack_presel_feedback_in(r->first_child, n);
+               restack_presel_feedback_in(r->second_child, n);
        }
 }