diff --git a/src/tree.c b/src/tree.c index 65d709a5..836183ec 100644 --- a/src/tree.c +++ b/src/tree.c @@ -367,8 +367,8 @@ void tree_close_con(kill_window_t kill_window) { if (focused->type == CT_WORKSPACE) { DLOG("Workspaces cannot be close, closing all children instead\n"); Con *child, *nextchild; - for (child = TAILQ_FIRST(&(focused->nodes_head)); child; ) { - nextchild = TAILQ_NEXT(child, nodes); + 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; diff --git a/testcases/t/129-focus-after-close.t b/testcases/t/129-focus-after-close.t index 8d9ccbb9..2ebfd610 100644 --- a/testcases/t/129-focus-after-close.t +++ b/testcases/t/129-focus-after-close.t @@ -143,6 +143,31 @@ sync_with_i3; ($nodes, $focus) = get_ws_content($tmp); is(scalar @$nodes, 0, 'workspace is empty'); +################################################################################ +# check if killing a workspace also closes floating windows. +################################################################################ + +$tmp = fresh_workspace; + +$window = open_window; +my $floating_window = open_floating_window; + +# one window opened on the current workspace +($nodes, $focus) = get_ws_content($tmp); +is(scalar @$focus, 2, 'workspace contains two nodes'); + +# focus the workspace +cmd "focus parent"; +cmd "focus parent"; + +# try to kill the workspace +cmd "kill"; +sync_with_i3; + +# the workspace should now be empty +($nodes, $focus) = get_ws_content($tmp); +is(scalar @$focus, 0, 'workspace is empty'); + ############################################################## # and now for something completely different: # check if the pointer position is relevant when restoring focus