From c70fa8078fd98ac68499330a78b8f9f67a48b07b Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 20 Aug 2017 14:56:44 +0200 Subject: [PATCH] Focus windows upon ConfigureWindow with stack-mode=Above (#2865) fixes #2708 fixes #2745 --- src/handlers.c | 21 ++++++++++++++-- testcases/t/269-focus-stack-above.t | 39 +++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 testcases/t/269-focus-stack-above.t diff --git a/src/handlers.c b/src/handlers.c index 9fb9040e..7d83f541 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -400,11 +400,28 @@ static void handle_configure_request(xcb_configure_request_event_t *event) { DLOG("Dock client will not be moved, we only support moving it to another output.\n"); } } + fake_absolute_configure_notify(con); + return; } - fake_absolute_configure_notify(con); + if (event->value_mask & XCB_CONFIG_WINDOW_STACK_MODE) { + DLOG("window 0x%08x wants to be stacked %d\n", event->window, event->stack_mode); + if (event->stack_mode == XCB_STACK_MODE_ABOVE) { + /* Emacs and IntelliJ Idea “request focus” by stacking their window + * above all others. */ + if (!fullscreen && con_is_leaf(con)) { + if (strcmp(con_get_workspace(con)->name, "__i3_scratch") == 0) { + DLOG("This is a scratchpad container, ignoring ConfigureRequest\n"); + return; + } - return; + con_focus(con); + tree_render(); + } + } + } + + fake_absolute_configure_notify(con); } /* diff --git a/testcases/t/269-focus-stack-above.t b/testcases/t/269-focus-stack-above.t new file mode 100644 index 00000000..e1785260 --- /dev/null +++ b/testcases/t/269-focus-stack-above.t @@ -0,0 +1,39 @@ +#!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) +# +# Verifies a ConfigureWindow request with stack-mode=Above is translated into +# focusing the target window by i3. +# Ticket: #2708 +# Bug still in: 4.13-207-gafdf6792 +use i3test; +use X11::XCB qw(CONFIG_WINDOW_STACK_MODE STACK_MODE_ABOVE); + +my $ws = fresh_workspace; +my $left_window = open_window; +my $right_window = open_window; + +is($x->input_focus, $right_window->id, 'right window has focus'); +my $old_focus = get_focused($ws); + +$x->configure_window($left_window->id, CONFIG_WINDOW_STACK_MODE, (STACK_MODE_ABOVE)); +$x->flush; + +sync_with_i3; + +is($x->input_focus, $left_window->id, 'left window has focus'); +isnt(get_focused($ws), $old_focus, 'right window is no longer focused'); + +done_testing; -- 2.39.5