_con_move_to_con: Move upwards only on CT_FLOATING_CON
If target is inside a floating container but not its direct child, the move can be completed as is. Fixes #3402.
This commit is contained in:
parent
ede954128a
commit
d407393d0d
12
src/con.c
12
src/con.c
|
@ -1171,13 +1171,13 @@ static bool _con_move_to_con(Con *con, Con *target, bool behind_focused, bool fi
|
||||||
target = target->parent;
|
target = target->parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 3: if the target container is floating, we get the workspace instead.
|
/* 3: if the original target is the direct child of a floating container, we
|
||||||
* Only tiling windows need to get inserted next to the current container.
|
* can't move con next to it - floating containers have only one child - so
|
||||||
* */
|
* we get the workspace instead. */
|
||||||
Con *floatingcon = con_inside_floating(target);
|
if (target->type == CT_FLOATING_CON) {
|
||||||
if (floatingcon != NULL) {
|
|
||||||
DLOG("floatingcon, going up even further\n");
|
DLOG("floatingcon, going up even further\n");
|
||||||
target = floatingcon->parent;
|
orig_target = target;
|
||||||
|
target = target->parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (con->type == CT_FLOATING_CON) {
|
if (con->type == CT_FLOATING_CON) {
|
||||||
|
|
|
@ -321,6 +321,27 @@ sync_with_i3;
|
||||||
($nodes, $focus) = get_ws_content($target_ws);
|
($nodes, $focus) = get_ws_content($target_ws);
|
||||||
is(@{$nodes}, 1, 'tiling container moved to the target workspace');
|
is(@{$nodes}, 1, 'tiling container moved to the target workspace');
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Given 'S' and 'M' where 'M' is inside a floating container but not its direct
|
||||||
|
# child, when 'S' is moved to 'M', i3 should not crash.
|
||||||
|
# See issue: #3402
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
$target_ws = fresh_workspace;
|
||||||
|
$S = open_window;
|
||||||
|
open_window;
|
||||||
|
cmd 'splitv';
|
||||||
|
$M = open_window;
|
||||||
|
cmd 'mark target';
|
||||||
|
cmd 'focus parent, floating enable, focus child';
|
||||||
|
|
||||||
|
cmd '[id="' . $S->{id} . '"] move container to mark target';
|
||||||
|
does_i3_live;
|
||||||
|
|
||||||
|
# Note: this is not actively supported behavior.
|
||||||
|
$nodes = get_ws($target_ws)->{floating_nodes}->[0]->{nodes}->[0]->{nodes};
|
||||||
|
is(1, (grep { $_->{window} == $S->{id} } @{$nodes}), 'tiling container moved inside floating container');
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Given 'S' and 'M' are the same container, when 'S' is moved to 'M', then
|
# Given 'S' and 'M' are the same container, when 'S' is moved to 'M', then
|
||||||
# the command is ignored.
|
# the command is ignored.
|
||||||
|
|
Loading…
Reference in New Issue