]> git.sur5r.net Git - i3/i3/commitdiff
_con_move_to_con: Move upwards only on CT_FLOATING_CON 3403/head
authorOrestis Floros <orestisf1993@gmail.com>
Fri, 14 Sep 2018 13:09:45 +0000 (16:09 +0300)
committerOrestis Floros <orestisf1993@gmail.com>
Fri, 14 Sep 2018 13:13:41 +0000 (16:13 +0300)
If target is inside a floating container but not its direct child, the
move can be completed as is.

Fixes #3402.

src/con.c
testcases/t/243-move-to-mark.t

index ca65a150e149c07ff1ffb8a36636ba4d70b188eb..a620a57106db4866bebaa0219707e404006d4d9c 100644 (file)
--- 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) {
index c6b67f35ac7a38db7a64118607041b4c40d9e0fe..5e806cd4653f37c7003e54b2d5309c99b4749b30 100644 (file)
@@ -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.