]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: don't focus unmapped container on manage
authorTony Crisci <tony@dubstepdish.com>
Mon, 23 Jun 2014 21:25:23 +0000 (17:25 -0400)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 24 Jun 2014 07:01:04 +0000 (09:01 +0200)
A window may become unmapped on manage when an assignment command unmaps
the window, such as moving it to the scratchpad or killing it.

This can cause i3 focus to be an unmapped window and different than X
focus which can lead to complications

fixes #1283

src/manage.c
testcases/t/233-regress-manage-focus-unmapped.t [new file with mode: 0644]

index 8f442e0acfe5326812daf2b92a17fd0a883305e1..9eee35786d2c5b01c0e780577f5a7ebc4758c84c 100644 (file)
@@ -505,7 +505,7 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
 
     /* Defer setting focus after the 'new' event has been sent to ensure the
      * proper window event sequence. */
-    if (set_focus) {
+    if (set_focus && nc->mapped) {
         DLOG("Now setting focus.\n");
         con_focus(nc);
     }
diff --git a/testcases/t/233-regress-manage-focus-unmapped.t b/testcases/t/233-regress-manage-focus-unmapped.t
new file mode 100644 (file)
index 0000000..1b78f25
--- /dev/null
@@ -0,0 +1,58 @@
+#!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)
+#
+# Test that an assignment that unmaps a window does not disturb input focus.
+# This can cause i3 focus to be an unmapped window and different than X focus
+# which can lead to complications
+# Ticket: #1283
+# Bug still in: 4.8-24-g60070de
+use i3test i3_autostart => 0;
+
+my $config = <<'EOT';
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+for_window [class="^special_kill$"] kill
+for_window [class="^special_scratchpad$"] move scratchpad
+EOT
+
+my $pid = launch_with_config($config);
+
+my $win = open_window;
+
+my $scratch_window = open_window(
+    wm_class => 'special_scratchpad',
+    dont_map => 1
+);
+$scratch_window->map;
+sync_with_i3;
+
+is($x->input_focus, $win->{id},
+    'an assignment that sends a window to the scratchpad should not disturb focus');
+
+my $kill_window = open_window(
+    wm_class => 'special_kill',
+    dont_map => 1
+);
+$kill_window->map;
+sync_with_i3;
+
+is($x->input_focus, $win->{id},
+    'an assignment that kills a window should not disturb focus');
+
+exit_gracefully($pid);
+
+done_testing;