]> git.sur5r.net Git - i3/i3/commitdiff
Fix erratic behavior with single container child jumping outputs
authorVladimir Panteleev <git@thecybershadow.net>
Thu, 14 Sep 2017 15:41:48 +0000 (15:41 +0000)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 19 Sep 2017 13:46:07 +0000 (15:46 +0200)
This fixes a regression introduced in commit
4e88c10564ca5366c2578908f62ec56625a26718: when attempting to move the
single child of a container in the direction of another output, i3
would move the window to the output, despite the window not being at
the edge of its output, instead of moving it to its parent container.

The bug occurred because the check for moving containers across
outputs with non-default workspace layouts (issue #1603) did not
actually verify that the moved window lies at the edge of the
workspace, despite what its comment said.

Fixes issue #2466.

src/move.c
testcases/t/537-move-single-to-output.t [new file with mode: 0644]

index 70c8c7885521c52724eaa29c1ec3724ad535ed85..3ecc69e4c762c7c63e2e38ab6a9ceadaeb91edf0 100644 (file)
@@ -248,7 +248,8 @@ void tree_move(Con *con, int direction) {
                         ? AFTER
                         : BEFORE);
         insert_con_into(con, target, position);
-    } else if (con->parent->parent->type == CT_WORKSPACE &&
+    } else if (!next &&
+               con->parent->parent->type == CT_WORKSPACE &&
                con->parent->layout != L_DEFAULT &&
                con_num_children(con->parent) == 1) {
         /* Con is the lone child of a non-default layout container at the edge
diff --git a/testcases/t/537-move-single-to-output.t b/testcases/t/537-move-single-to-output.t
new file mode 100644 (file)
index 0000000..db5b492
--- /dev/null
@@ -0,0 +1,63 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Please read the following documents before working on tests:
+# • http://build.i3wm.org/docs/testsuite.html
+#   (or docs/testsuite)
+#
+# • http://build.i3wm.org/docs/lib-i3test.html
+#   (alternatively: perldoc ./testcases/lib/i3test.pm)
+#
+# • http://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)
+#
+# Tests that windows inside containers with a single child do not jump
+# over other containers and erratically move across outputs.
+# Ticket: #2466
+# Bug still in: 4.14-63-g75d11820
+use i3test i3_config => <<EOT;
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+fake-outputs 640x480+0+0,640x480+640+0
+
+workspace left output fake-0
+workspace right output fake-1
+EOT
+
+cmd 'workspace right';
+
+# ┌───────────────────────────┐ ┌───────────────────────────┐
+# │         Output 1          │ │     Output 2 - splith     │
+# │                           │ │┌───────────┐┌────────────┐│
+# │                           │ ││           ││   splitv   ││
+# │                           │ ││           ││╔══════════╗││
+# │                           │ ││           ││║          ║││
+# │     (empty workspace)     │ ││   first   ││║  second  ║││
+# │                           │ ││           ││║          ║││
+# │                           │ ││           ││║          ║││
+# │                           │ ││           ││╚══════════╝││
+# │                           │ │└───────────┘└────────────┘│
+# └───────────────────────────┘ └───────────────────────────┘
+#
+# Moving "second" left shouldn't cause it to jump over to output 1.
+
+my $first = open_window;
+my $second = open_window;
+
+# Put the second window into its own splitv container
+cmd 'split v';
+
+is_num_children('left', 0, 'No children on left');
+is_num_children('right', 2, 'Two children on right');
+
+# Move the second window to the left
+cmd 'move left';
+
+is_num_children('left', 0, 'Still no children on left');
+is_num_children('right', 2, 'Still two children on right');
+
+done_testing;