From d407393d0da3dce2382b60c6abf6540a174798a1 Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Fri, 14 Sep 2018 16:09:45 +0300 Subject: [PATCH] _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. --- src/con.c | 12 ++++++------ testcases/t/243-move-to-mark.t | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/con.c b/src/con.c index ca65a150..a620a571 100644 --- a/src/con.c +++ b/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; } - /* 3: if the target container is floating, we get the workspace instead. - * Only tiling windows need to get inserted next to the current container. - * */ - Con *floatingcon = con_inside_floating(target); - if (floatingcon != NULL) { + /* 3: if the original target is the direct child of a floating container, we + * can't move con next to it - floating containers have only one child - so + * we get the workspace instead. */ + if (target->type == CT_FLOATING_CON) { DLOG("floatingcon, going up even further\n"); - target = floatingcon->parent; + orig_target = target; + target = target->parent; } if (con->type == CT_FLOATING_CON) { diff --git a/testcases/t/243-move-to-mark.t b/testcases/t/243-move-to-mark.t index c6b67f35..5e806cd4 100644 --- a/testcases/t/243-move-to-mark.t +++ b/testcases/t/243-move-to-mark.t @@ -321,6 +321,27 @@ sync_with_i3; ($nodes, $focus) = get_ws_content($target_ws); 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 # the command is ignored.