Close empty workspaces if they're not visible.

Previously, we'd only close an empty workspace when we moved away
from it. Now we also close it when the last client exits, as long
as that workspace is not visible anymore.
This commit is contained in:
Fernando Tarlá Cardoso Lemos 2011-10-23 19:06:43 -02:00 committed by Michael Stapelberg
parent f4469eee0b
commit d490bae8a2
2 changed files with 35 additions and 2 deletions

View File

@ -1007,14 +1007,25 @@ static void con_on_remove_child(Con *con) {
/* Every container 'above' (in the hierarchy) the workspace content should /* Every container 'above' (in the hierarchy) the workspace content should
* not be closed when the last child was removed */ * not be closed when the last child was removed */
if (con->type == CT_WORKSPACE || if (con->type == CT_OUTPUT ||
con->type == CT_OUTPUT ||
con->type == CT_ROOT || con->type == CT_ROOT ||
con->type == CT_DOCKAREA) { con->type == CT_DOCKAREA) {
DLOG("not handling, type = %d\n", con->type); DLOG("not handling, type = %d\n", con->type);
return; 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 /* TODO: check if this container would swallow any other client and
* dont close it automatically. */ * dont close it automatically. */
int children = con_num_children(con); int children = con_num_children(con);

View File

@ -0,0 +1,22 @@
#!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;