diff --git a/include/tree.h b/include/tree.h index 029bbe34..fd393d8b 100644 --- a/include/tree.h +++ b/include/tree.h @@ -21,7 +21,7 @@ void tree_render(); void tree_close_con(); void tree_next(char way, orientation_t orientation); void tree_move(char way, orientation_t orientation); -void tree_close(Con *con); +void tree_close(Con *con, bool kill_window); bool tree_restore(); #endif diff --git a/src/cmdparse.y b/src/cmdparse.y index 47faa7f7..31d7535b 100644 --- a/src/cmdparse.y +++ b/src/cmdparse.y @@ -314,11 +314,11 @@ kill: printf("killing!\n"); /* check if the match is empty, not if the result is empty */ if (match_is_empty(¤t_match)) - tree_close(focused); + tree_close(focused, true); else { TAILQ_FOREACH(current, &owindows, owindows) { printf("matching: %p / %s\n", current->con, current->con->name); - tree_close(current->con); + tree_close(current->con, true); } } diff --git a/src/floating.c b/src/floating.c index cd387ba8..2afe1b82 100644 --- a/src/floating.c +++ b/src/floating.c @@ -37,7 +37,7 @@ void toggle_floating_mode(Con *con, bool automatic) { /* 2: kill parent container */ TAILQ_REMOVE(&(con->parent->parent->floating_head), con->parent, floating_windows); - tree_close(con->parent); + tree_close(con->parent, false); /* 3: re-attach to previous parent */ con->parent = con->old_parent; diff --git a/src/handlers.c b/src/handlers.c index bca297ee..e351aea0 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -469,7 +469,7 @@ int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_noti return 1; } - tree_close(con); + tree_close(con, false); tree_render(); x_push_changes(croot); return 1; diff --git a/src/tree.c b/src/tree.c index 8a3bdf2d..d8fc9f4a 100644 --- a/src/tree.c +++ b/src/tree.c @@ -108,7 +108,7 @@ Con *tree_open_con(Con *con) { * Closes the given container including all children * */ -void tree_close(Con *con) { +void tree_close(Con *con, bool kill_window) { /* TODO: check floating clients and adjust old_parent if necessary */ /* Get the container which is next focused */ @@ -129,7 +129,19 @@ void tree_close(Con *con) { * in their parent’s nodes_head */ while (!TAILQ_EMPTY(&(con->nodes_head))) { child = TAILQ_FIRST(&(con->nodes_head)); - tree_close(child); + tree_close(child, kill_window); + } + + if (con->window != NULL) { + if (kill_window) + x_window_kill(con->window->id); + else { + /* un-parent the window */ + xcb_reparent_window(conn, con->window->id, root, 0, 0); + /* TODO: client_unmap to set state to withdrawn */ + + } + free(con->window); } /* kill the X11 part of this container */ @@ -138,10 +150,6 @@ void tree_close(Con *con) { con_detach(con); con_fix_percent(con->parent, WINDOW_REMOVE); - if (con->window != NULL) { - x_window_kill(con->window->id); - free(con->window); - } free(con->name); TAILQ_REMOVE(&all_cons, con, all_cons); free(con); @@ -158,7 +166,7 @@ void tree_close_con() { } /* Kill con */ - tree_close(focused); + tree_close(focused, true); } /* diff --git a/src/workspace.c b/src/workspace.c index 1829370c..6404cff0 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -117,7 +117,7 @@ void workspace_show(const char *num) { if (TAILQ_EMPTY(&(old->nodes_head))) { LOG("Closing old workspace (%p / %s), it is empty\n", old, old->name); - tree_close(old); + tree_close(old, false); } con_focus(next);