]> git.sur5r.net Git - i3/i3/commitdiff
refactor code for removing children from a con
authorMichael Stapelberg <michael@stapelberg.de>
Mon, 14 Feb 2011 17:08:36 +0000 (18:08 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Mon, 14 Feb 2011 17:08:36 +0000 (18:08 +0100)
Let’s see how this callback stuff will work out. If it doesn’t work out well,
we will remove it.

include/data.h
include/util.h
src/con.c
src/tree.c

index b3974a3a58bd24f3b4b1c8a2b7b05f3f56eff154..5c4a88526c35e1e8c602f10ff986f51aa17428e1 100644 (file)
@@ -358,6 +358,9 @@ struct Con {
     TAILQ_ENTRY(Con) focused;
     TAILQ_ENTRY(Con) all_cons;
     TAILQ_ENTRY(Con) floating_windows;
+
+    /** callbacks */
+    void(*on_remove_child)(Con *);
 };
 
 #endif
index 91b533a1bcae9ce8be8441320847212dd9519792..064a4792d8cb4a4635352a5bfae91ac51ee10e90 100644 (file)
@@ -34,6 +34,8 @@
 } \
 while (0)
 
+#define CALL(obj, member, ...) obj->member(obj, ## __VA_ARGS__)
+
 int min(int a, int b);
 int max(int a, int b);
 bool rect_contains(Rect rect, uint32_t x, uint32_t y);
index c04d281e909161a9cfc05756294ad5d020be3837..65b974438dd61bb9ac6ddf4754ca69aeab9b7bba 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -24,6 +24,8 @@ char *colors[] = {
     "#aa00aa"
 };
 
+static void con_on_remove_child(Con *con);
+
 /*
  * Create a new container (and attach it to the given parent, if not NULL).
  * This function initializes the data structures and creates the appropriate
@@ -32,6 +34,7 @@ char *colors[] = {
  */
 Con *con_new(Con *parent) {
     Con *new = scalloc(sizeof(Con));
+    new->on_remove_child = con_on_remove_child;
     TAILQ_INSERT_TAIL(&all_cons, new, all_cons);
     new->type = CT_CON;
     new->border_style = config.default_border;
@@ -522,14 +525,7 @@ void con_move_to_workspace(Con *con, Con *workspace) {
     /* 8: keep focus on the current workspace */
     con_focus(focus_next);
 
-    /* 9: check if the parent container is empty now and close it */
-    if (parent->type != CT_WORKSPACE &&
-        TAILQ_EMPTY(&(parent->nodes_head))) {
-        DLOG("Closing empty parent container\n");
-        /* TODO: check if this container would swallow any other client and
-         * don’t close it automatically. */
-        tree_close(parent, false, false);
-    }
+    CALL(parent, on_remove_child);
 }
 
 /*
@@ -744,3 +740,17 @@ void con_set_layout(Con *con, int layout) {
 
     con->layout = layout;
 }
+
+static void con_on_remove_child(Con *con) {
+    /* Nothing to do for workspaces */
+    if (con->type == CT_WORKSPACE)
+        return;
+
+    /* TODO: check if this container would swallow any other client and
+     * don’t close it automatically. */
+    DLOG("on_remove_child\n");
+    if (con_num_children(con) == 0) {
+        DLOG("Container empty, closing\n");
+        tree_close(con, false, false);
+    }
+}
index f402aa7d575d0b0f84da87dbf15be524b65168df..77da3ac3d90041e92fecc8c6d4d8aae01ee06b59 100644 (file)
@@ -190,14 +190,8 @@ void tree_close(Con *con, bool kill_window, bool dont_kill_parent) {
     }
 
     /* check if the parent container is empty now and close it */
-    if (!dont_kill_parent &&
-        parent->type != CT_WORKSPACE &&
-        TAILQ_EMPTY(&(parent->nodes_head))) {
-        DLOG("Closing empty parent container\n");
-        /* TODO: check if this container would swallow any other client and
-         * don’t close it automatically. */
-        tree_close(parent, false, false);
-    }
+    if (!dont_kill_parent)
+        CALL(parent, on_remove_child);
 }
 
 /*
@@ -504,6 +498,8 @@ void tree_move(char way, orientation_t orientation) {
                 fix_percent = true;
             }
 
+            CALL(con->parent, on_remove_child);
+
             TAILQ_INSERT_AFTER(&(next->parent->nodes_head), next, con, nodes);
             TAILQ_INSERT_HEAD(&(next->parent->focus_head), con, focused);
             /* TODO: don’t influence focus handling? */
@@ -567,13 +563,11 @@ void tree_move(char way, orientation_t orientation) {
      * container(s) would still point to the old container(s)). */
     con_focus(con);
 
-    if (con_num_children(old_parent) == 0) {
-        DLOG("Old container empty after moving. Let's close it\n");
-        tree_close(old_parent, false, false);
-    } else if (level_changed) {
-        /* fix the percentages in the container we moved from */
+    /* fix the percentages in the container we moved from */
+    if (level_changed)
         con_fix_percent(old_parent);
-    }
+
+    CALL(old_parent, on_remove_child);
 
     tree_flatten(croot);
 }