Bugfix: don’t kill parent when currently in tree_close() for a child of this parent
This commit is contained in:
parent
f0efb3737e
commit
d760a1c7b2
@ -76,7 +76,7 @@ void tree_move(char way, orientation_t orientation);
|
|||||||
* Closes the given container including all children
|
* Closes the given container including all children
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void tree_close(Con *con, bool kill_window);
|
void tree_close(Con *con, bool kill_window, bool dont_kill_parent);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads tree from ~/.i3/_restart.json (used for in-place restarts).
|
* Loads tree from ~/.i3/_restart.json (used for in-place restarts).
|
||||||
|
@ -382,7 +382,7 @@ kill:
|
|||||||
else {
|
else {
|
||||||
TAILQ_FOREACH(current, &owindows, owindows) {
|
TAILQ_FOREACH(current, &owindows, owindows) {
|
||||||
printf("matching: %p / %s\n", current->con, current->con->name);
|
printf("matching: %p / %s\n", current->con, current->con->name);
|
||||||
tree_close(current->con, true);
|
tree_close(current->con, true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ void floating_disable(Con *con, bool automatic) {
|
|||||||
/* 2: kill parent container */
|
/* 2: kill parent container */
|
||||||
TAILQ_REMOVE(&(con->parent->parent->floating_head), con->parent, floating_windows);
|
TAILQ_REMOVE(&(con->parent->parent->floating_head), con->parent, floating_windows);
|
||||||
TAILQ_REMOVE(&(con->parent->parent->focus_head), con->parent, focused);
|
TAILQ_REMOVE(&(con->parent->parent->focus_head), con->parent, focused);
|
||||||
tree_close(con->parent, false);
|
tree_close(con->parent, false, false);
|
||||||
|
|
||||||
/* 3: re-attach to previous parent */
|
/* 3: re-attach to previous parent */
|
||||||
con->parent = con->old_parent;
|
con->parent = con->old_parent;
|
||||||
|
@ -436,7 +436,7 @@ int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_noti
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tree_close(con, false);
|
tree_close(con, false, false);
|
||||||
tree_render();
|
tree_render();
|
||||||
x_push_changes(croot);
|
x_push_changes(croot);
|
||||||
return 1;
|
return 1;
|
||||||
|
14
src/tree.c
14
src/tree.c
@ -143,7 +143,7 @@ static void fix_floating_parent(Con *con, Con *vanishing) {
|
|||||||
* Closes the given container including all children
|
* Closes the given container including all children
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void tree_close(Con *con, bool kill_window) {
|
void tree_close(Con *con, bool kill_window, bool dont_kill_parent) {
|
||||||
Con *parent = con->parent;
|
Con *parent = con->parent;
|
||||||
|
|
||||||
/* check floating clients and adjust old_parent if necessary */
|
/* check floating clients and adjust old_parent if necessary */
|
||||||
@ -158,7 +158,8 @@ void tree_close(Con *con, bool kill_window) {
|
|||||||
* in their parent’s nodes_head */
|
* in their parent’s nodes_head */
|
||||||
while (!TAILQ_EMPTY(&(con->nodes_head))) {
|
while (!TAILQ_EMPTY(&(con->nodes_head))) {
|
||||||
child = TAILQ_FIRST(&(con->nodes_head));
|
child = TAILQ_FIRST(&(con->nodes_head));
|
||||||
tree_close(child, kill_window);
|
DLOG("killing child=%p\n", child);
|
||||||
|
tree_close(child, kill_window, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (con->window != NULL) {
|
if (con->window != NULL) {
|
||||||
@ -199,12 +200,13 @@ void tree_close(Con *con, bool kill_window) {
|
|||||||
con_focus(next);
|
con_focus(next);
|
||||||
|
|
||||||
/* check if the parent container is empty now and close it */
|
/* check if the parent container is empty now and close it */
|
||||||
if (parent->type != CT_WORKSPACE &&
|
if (!dont_kill_parent &&
|
||||||
|
parent->type != CT_WORKSPACE &&
|
||||||
TAILQ_EMPTY(&(parent->nodes_head))) {
|
TAILQ_EMPTY(&(parent->nodes_head))) {
|
||||||
DLOG("Closing empty parent container\n");
|
DLOG("Closing empty parent container\n");
|
||||||
/* TODO: check if this container would swallow any other client and
|
/* TODO: check if this container would swallow any other client and
|
||||||
* don’t close it automatically. */
|
* don’t close it automatically. */
|
||||||
tree_close(parent, false);
|
tree_close(parent, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,7 +222,7 @@ void tree_close_con() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Kill con */
|
/* Kill con */
|
||||||
tree_close(focused, true);
|
tree_close(focused, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -443,6 +445,6 @@ void tree_move(char way, orientation_t orientation) {
|
|||||||
|
|
||||||
if (con_num_children(old_parent) == 0) {
|
if (con_num_children(old_parent) == 0) {
|
||||||
DLOG("Old container empty after moving. Let's close it\n");
|
DLOG("Old container empty after moving. Let's close it\n");
|
||||||
tree_close(old_parent, false);
|
tree_close(old_parent, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -209,7 +209,7 @@ void workspace_show(const char *num) {
|
|||||||
/* check if this workspace is currently visible */
|
/* check if this workspace is currently visible */
|
||||||
if (!workspace_is_visible(old)) {
|
if (!workspace_is_visible(old)) {
|
||||||
LOG("Closing old workspace (%p / %s), it is empty\n", old, old->name);
|
LOG("Closing old workspace (%p / %s), it is empty\n", old, old->name);
|
||||||
tree_close(old, false);
|
tree_close(old, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user