Move container to marked workspace: refine corner case

This commit should fix "move con to parent" trick (see below) in the
case when con->parent->parent is a workspace.

The trick:

    mark _a, focus parent, focus parent, mark _b,
    [con_mark=_a] move window to mark _b, [con_mark=_a] focus

The trick got broken in commit 626af81232
in order to fix an i3 crash ().  Reverting said commit fixes the
trick.  The crash is caused by the fact that empty workspace isn't
considered a split (checked in src/con.c:1324), so the moved window ends
up as a sibling of the target workspace, not as its child.
This commit is contained in:
Albert Safin
2019-10-07 06:13:43 +00:00
parent ba0868e593
commit beb96ad18c
4 changed files with 41 additions and 3 deletions

@ -1312,8 +1312,8 @@ bool con_move_to_mark(Con *con, const char *mark) {
return true;
}
if (target->type == CT_WORKSPACE) {
DLOG("target container is a workspace, simply moving the container there.\n");
if (target->type == CT_WORKSPACE && con_is_leaf(target)) {
DLOG("target container is an empty workspace, simply moving the container there.\n");
con_move_to_workspace(con, target, true, false, false);
return true;
}

@ -1230,7 +1230,7 @@ sub create_layout {
$r = $r . '{"swallows": [{';
$r = $r . '"class": "^' . "$char" . '$"';
$r = $r . '}]},';
$r = $r . '}]}' . ($depth == 0 ? "\n" : ',');
} else {
die "Could not understand $char";
}

@ -361,6 +361,7 @@ does_i3_live;
###############################################################################
# Given 'S' and 'M' where 'M' is a workspace and 'S' is on a different
# workspace, then 'S' ends up as a tiling container on 'M'.
# See issue: #2003
###############################################################################
fresh_workspace;

@ -0,0 +1,37 @@
#!perl
# vim:ts=4:sw=4:expandtab
#
# Please read the following documents before working on tests:
# • https://build.i3wm.org/docs/testsuite.html
# (or docs/testsuite)
#
# • https://build.i3wm.org/docs/lib-i3test.html
# (alternatively: perldoc ./testcases/lib/i3test.pm)
#
# • https://build.i3wm.org/docs/ipc.html
# (or docs/ipc)
#
# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
# (unless you are already familiar with Perl)
#
# Make sure the trick used to move the container to its parent works.
# https://github.com/i3/i3/issues/1326#issuecomment-349082811
use i3test;
cmp_tree(
msg => 'Move to parent when the parent is a workspace',
layout_before => 'a H[b*] c',
layout_after => 'a b* c',
cb => sub {
cmd 'mark _a, focus parent, focus parent, mark _b, [con_mark=_a] move window to mark _b, [con_mark=_a] focus';
});
cmp_tree(
msg => 'Move to parent when the parent is a split',
layout_before => 'V[a H[b*] c]',
layout_after => 'V[a b* c]',
cb => sub {
cmd 'mark _a, focus parent, focus parent, mark _b, [con_mark=_a] move window to mark _b, [con_mark=_a] focus';
});
done_testing;