/* Every container 'above' (in the hierarchy) the workspace content should
* not be closed when the last child was removed */
- if (con->type == CT_WORKSPACE ||
- con->type == CT_OUTPUT ||
+ if (con->type == CT_OUTPUT ||
con->type == CT_ROOT ||
con->type == CT_DOCKAREA) {
DLOG("not handling, type = %d\n", con->type);
return;
}
+ /* For workspaces, close them only if they're not visible anymore */
+ if (con->type == CT_WORKSPACE) {
+ int children = con_num_children(con);
+ if (children == 0 && !workspace_is_visible(con)) {
+ LOG("Closing old workspace (%p / %s), it is empty\n", con, con->name);
+ tree_close(con, DONT_KILL_WINDOW, false, false);
+ ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"empty\"}");
+ ewmh_update_workarea();
+ }
+ return;
+ }
+
/* TODO: check if this container would swallow any other client and
* don’t close it automatically. */
int children = con_num_children(con);
--- /dev/null
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests if empty workspaces are closed when the last child
+# exits, as long as they're not empty.
+#
+use i3test;
+
+my $i3 = i3(get_socket_path());
+
+# Get a workspace and open a container
+my $ws = fresh_workspace;
+my $con = open_empty_con($i3);
+
+# Go to a second workspace, kill the container
+fresh_workspace;
+cmd "[con_id=\"$con\"] kill";
+
+# The first workspace should have been closed
+ok(!workspace_exists($ws), 'workspace closed');
+
+done_testing;