]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Correctly revert floating focus when killing the last floating window (+test)
authorMichael Stapelberg <michael@stapelberg.de>
Thu, 30 Jun 2011 23:10:43 +0000 (01:10 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Thu, 30 Jun 2011 23:10:43 +0000 (01:10 +0200)
src/con.c
testcases/t/35-floating-focus.t

index 185cbd3f232fd51a3f500ff8a9e3a2447a4dc10f..7ce782bc373c91467ec11a69c922d92c24153607 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -646,7 +646,12 @@ Con *con_next_focused(Con *con) {
     if (con->type == CT_FLOATING_CON) {
         DLOG("selecting next for CT_FLOATING_CON\n");
         next = TAILQ_NEXT(con, floating_windows);
-        if (next == TAILQ_END(&(parent->floating_head))) {
+        DLOG("next = %p\n", next);
+        if (!next) {
+            next = TAILQ_PREV(con, floating_head, floating_windows);
+            DLOG("using prev, next = %p\n", next);
+        }
+        if (!next) {
             Con *ws = con_get_workspace(con);
             next = ws;
             DLOG("no more floating containers for next = %p, restoring workspace focus\n", next);
index d0f8814ff6573cd203e08badd358f1baa63850e2..7d5cf53b1910c21655ab62c7ded7dbee1d91b760 100644 (file)
@@ -59,9 +59,9 @@ is($x->input_focus, $second->id, 'second con still focused after killing third')
 
 $tmp = fresh_workspace;
 
-$first = open_standard_window($x);    # window 5
-$second = open_standard_window($x);   # window 6
-my $third = open_standard_window($x); # window 7
+$first = open_standard_window($x, '#ff0000');    # window 5
+$second = open_standard_window($x, '#00ff00');   # window 6
+my $third = open_standard_window($x, '#0000ff'); # window 7
 
 is($x->input_focus, $third->id, 'last container focused');
 
@@ -87,4 +87,42 @@ sleep 0.25;
 
 is($x->input_focus, $first->id, 'first con focused after killing all floating cons');
 
+#############################################################################
+# 4: same test as 3, but with another split con
+#############################################################################
+
+$tmp = fresh_workspace;
+
+$first = open_standard_window($x, '#ff0000');    # window 5
+cmd 'split v';
+cmd 'layout stacked';
+$second = open_standard_window($x, '#00ff00');   # window 6
+$third = open_standard_window($x, '#0000ff'); # window 7
+
+is($x->input_focus, $third->id, 'last container focused');
+
+cmd 'floating enable';
+
+cmd '[id="' . $second->id . '"] focus';
+
+is($x->input_focus, $second->id, 'second con focused');
+
+cmd 'floating enable';
+
+sleep 0.5;
+
+# now kill the second one. focus should fall back to the third one, which is
+# also floating
+cmd 'kill';
+
+sleep 0.25;
+
+is($x->input_focus, $third->id, 'second con focused');
+
+cmd 'kill';
+
+sleep 0.25;
+
+is($x->input_focus, $first->id, 'first con focused after killing all floating cons');
+
 done_testing;