diff --git a/src/manage.c b/src/manage.c index 8f442e0a..9eee3578 100644 --- a/src/manage.c +++ b/src/manage.c @@ -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 index 00000000..1b78f253 --- /dev/null +++ b/testcases/t/233-regress-manage-focus-unmapped.t @@ -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;