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:
parent
f4469eee0b
commit
d490bae8a2
15
src/con.c
15
src/con.c
|
@ -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
|
||||||
* don’t close it automatically. */
|
* don’t close it automatically. */
|
||||||
int children = con_num_children(con);
|
int children = con_num_children(con);
|
||||||
|
|
|
@ -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;
|
Loading…
Reference in New Issue