]> git.sur5r.net Git - i3/i3/blobdiff - src/tree.c
Merge branch 'next' into master
[i3/i3] / src / tree.c
index 92b56e6c310909afe95ea828a796f1b7d9e36259..2d4647f8dfba08b7d6c97abe3fc1588119d905a0 100644 (file)
@@ -1,5 +1,3 @@
-#undef I3__FILE__
-#define I3__FILE__ "tree.c"
 /*
  * vim:ts=4:sw=4:expandtab
  *
@@ -84,6 +82,7 @@ bool tree_restore(const char *path, xcb_get_geometry_reply_t *geometry) {
     focused = croot;
 
     tree_append_json(focused, globbed, NULL);
+    free(globbed);
 
     DLOG("appended tree, using new root\n");
     croot = TAILQ_FIRST(&(croot->nodes_head));
@@ -185,11 +184,11 @@ static bool _is_con_mapped(Con *con) {
  * recursively while deleting a containers children.
  *
  * The force_set_focus flag is specified in the case of killing a floating
- * window: tree_close() will be invoked for the CT_FLOATINGCON (the parent
+ * window: tree_close_internal() will be invoked for the CT_FLOATINGCON (the parent
  * container) and focus should be set there.
  *
  */
-bool tree_close(Con *con, kill_window_t kill_window, bool dont_kill_parent, bool force_set_focus) {
+bool tree_close_internal(Con *con, kill_window_t kill_window, bool dont_kill_parent, bool force_set_focus) {
     bool was_mapped = con->mapped;
     Con *parent = con->parent;
 
@@ -202,7 +201,7 @@ bool tree_close(Con *con, kill_window_t kill_window, bool dont_kill_parent, bool
 
     /* remove the urgency hint of the workspace (if set) */
     if (con->urgent) {
-        con->urgent = false;
+        con_set_urgency(con, false);
         con_update_parents_urgency(con);
         workspace_update_urgent_flag(con_get_workspace(con));
     }
@@ -219,7 +218,7 @@ bool tree_close(Con *con, kill_window_t kill_window, bool dont_kill_parent, bool
     for (child = TAILQ_FIRST(&(con->nodes_head)); child;) {
         nextchild = TAILQ_NEXT(child, nodes);
         DLOG("killing child=%p\n", child);
-        if (!tree_close(child, kill_window, true, false))
+        if (!tree_close_internal(child, kill_window, true, false))
             abort_kill = true;
         child = nextchild;
     }
@@ -265,11 +264,8 @@ bool tree_close(Con *con, kill_window_t kill_window, bool dont_kill_parent, bool
             add_ignore_event(cookie.sequence, 0);
         }
         ipc_send_window_event("close", con);
-        FREE(con->window->class_class);
-        FREE(con->window->class_instance);
-        i3string_free(con->window->name);
-        FREE(con->window->ran_assignments);
-        FREE(con->window);
+        window_free(con->window);
+        con->window = NULL;
     }
 
     Con *ws = con_get_workspace(con);
@@ -310,7 +306,7 @@ bool tree_close(Con *con, kill_window_t kill_window, bool dont_kill_parent, bool
      * underlying container, see ticket #660.
      *
      * Rendering has to be avoided when dont_kill_parent is set (when
-     * tree_close calls itself recursively) because the tree is in a
+     * tree_close_internal calls itself recursively) because the tree is in a
      * non-renderable state during that time. */
     if (!dont_kill_parent)
         tree_render();
@@ -320,13 +316,25 @@ bool tree_close(Con *con, kill_window_t kill_window, bool dont_kill_parent, bool
 
     if (con_is_floating(con)) {
         DLOG("Container was floating, killing floating container\n");
-        tree_close(parent, DONT_KILL_WINDOW, false, (con == focused));
+        tree_close_internal(parent, DONT_KILL_WINDOW, false, (con == focused));
         DLOG("parent container killed\n");
     }
 
     free(con->name);
     FREE(con->deco_render_params);
     TAILQ_REMOVE(&all_cons, con, all_cons);
+    while (!TAILQ_EMPTY(&(con->swallow_head))) {
+        Match *match = TAILQ_FIRST(&(con->swallow_head));
+        TAILQ_REMOVE(&(con->swallow_head), match, matches);
+        match_free(match);
+        free(match);
+    }
+    while (!TAILQ_EMPTY(&(con->marks_head))) {
+        mark_t *mark = TAILQ_FIRST(&(con->marks_head));
+        TAILQ_REMOVE(&(con->marks_head), mark, marks);
+        FREE(mark->name);
+        FREE(mark);
+    }
     free(con);
 
     /* in the case of floating windows, we already focused another container
@@ -362,34 +370,6 @@ bool tree_close(Con *con, kill_window_t kill_window, bool dont_kill_parent, bool
     return true;
 }
 
-/*
- * Closes the current container using tree_close().
- *
- */
-void tree_close_con(kill_window_t kill_window) {
-    assert(focused != NULL);
-
-    /* There *should* be no possibility to focus outputs / root container */
-    assert(focused->type != CT_OUTPUT);
-    assert(focused->type != CT_ROOT);
-
-    if (focused->type == CT_WORKSPACE) {
-        DLOG("Workspaces cannot be close, closing all children instead\n");
-        Con *child, *nextchild;
-        for (child = TAILQ_FIRST(&(focused->focus_head)); child;) {
-            nextchild = TAILQ_NEXT(child, focused);
-            DLOG("killing child=%p\n", child);
-            tree_close(child, kill_window, false, false);
-            child = nextchild;
-        }
-
-        return;
-    }
-
-    /* Kill con */
-    tree_close(focused, kill_window, false, false);
-}
-
 /*
  * Splits (horizontally or vertically) the given container by creating a new
  * container which contains the old one and the future ones.
@@ -403,7 +383,11 @@ void tree_split(Con *con, orientation_t orientation) {
 
     if (con->type == CT_WORKSPACE) {
         if (con_num_children(con) < 2) {
-            DLOG("Just changing orientation of workspace\n");
+            if (con_num_children(con) == 0) {
+                DLOG("Changing workspace_layout to L_DEFAULT\n");
+                con->workspace_layout = L_DEFAULT;
+            }
+            DLOG("Changing orientation of workspace\n");
             con->layout = (orientation == HORIZ) ? L_SPLITH : L_SPLITV;
             return;
         } else {
@@ -501,7 +485,7 @@ static void mark_unmapped(Con *con) {
     TAILQ_FOREACH(current, &(con->nodes_head), nodes)
     mark_unmapped(current);
     if (con->type == CT_WORKSPACE) {
-        /* We need to call mark_unmapped on floating nodes aswell since we can
+        /* We need to call mark_unmapped on floating nodes as well since we can
          * make containers floating. */
         TAILQ_FOREACH(current, &(con->floating_head), floating_windows)
         mark_unmapped(current);
@@ -773,7 +757,7 @@ void tree_flatten(Con *con) {
 
     /* 4: close the redundant cons */
     DLOG("closing redundant cons\n");
-    tree_close(con, DONT_KILL_WINDOW, true, false);
+    tree_close_internal(con, DONT_KILL_WINDOW, true, false);
 
     /* Well, we got to abort the recursion here because we destroyed the
      * container. However, if tree_flatten() is called sufficiently often,